I want to bind rows. However, few columns of the data.frames have different attributes. Like df1$caseid and df1$v001 have different attributes than df2$caseid and df2$v001. Wondering how can I can bind there data.frames.
library(tidyverse)
library(tidytable)
#>
#> Attaching package: 'tidytable'
#> The following object is masked from 'package:stats':
#>
#> dt
df1 <-
structure(list(caseid = structure(c(" 11 1 1 1 2", " 11 1 1 1 2",
" 11 1 1 1 2", " 11 1 1 1 2", " 11 1 1 1 2", " 11 1 1 2 2"
), label = "case identification", class = c("labelled", "character"
), format = "%15s"), bidx = structure(c(1L, 2L, 3L, 4L, 5L, 1L
), label = "birth column number", class = c("labelled", "integer"
), format = "%8.0g"), v000 = structure(c("PK2", "PK2", "PK2",
"PK2", "PK2", "PK2"), label = "country code and phase", class = c("labelled",
"character"), format = "%3s"), v001 = structure(c(1101001L, 1101001L,
1101001L, 1101001L, 1101001L, 1101001L), label = "cluster number", class = c("labelled",
"integer"), format = "%12.0g"), v002 = structure(c(1L, 1L, 1L,
1L, 1L, 2L), label = "household number", class = c("labelled",
"integer"), format = "%8.0g")), row.names = c(NA, -6L), class = "data.frame")
df2 <-
structure(list(caseid = structure(c(1L, 1L, 1L, 1L, 1L, 2L), .Label = c(" 1 1 2",
" 1 4 1"), class = "factor"), bidx = structure(c(1L,
2L, 3L, 4L, 5L, 1L), label = c(BIDX = "Birth column number"), class = c("labelled",
"numeric")), v000 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "PK7", class = "factor"),
v001 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), label = c(V001 = "Cluster number"), class = c("labelled",
"numeric")), v002 = structure(c(1L, 1L, 1L, 1L, 1L, 4L), label = c(V002 = "Household number"), class = c("labelled",
"numeric"))), row.names = c(NA, -6L), class = "data.frame")
rbind(df1, df2)
#> caseid bidx v000 v001 v002
#> 1 11 1 1 1 2 1 PK2 1101001 1
#> 2 11 1 1 1 2 2 PK2 1101001 1
#> 3 11 1 1 1 2 3 PK2 1101001 1
#> 4 11 1 1 1 2 4 PK2 1101001 1
#> 5 11 1 1 1 2 5 PK2 1101001 1
#> 6 11 1 1 2 2 1 PK2 1101001 2
#> 7 1 1 2 1 PK7 1 1
#> 8 1 1 2 2 PK7 1 1
#> 9 1 1 2 3 PK7 1 1
#> 10 1 1 2 4 PK7 1 1
#> 11 1 1 2 5 PK7 1 1
#> 12 1 4 1 1 PK7 1 4
bind_rows(df1, df2)
#> Error: Can't combine `..1$caseid` <labelled> and `..2$caseid` <factor<da793>>.
bind_rows.(df1, df2)
#> Error in rbindlist(dots, idcol = .id, use.names = .use_names, fill = .fill): Class attribute on column 2 of item 2 does not match with column 2 of item 1.
It sounds like you need to fix the column classes to match no matter what. If the numeric columns are always integers, change the classes in
df2to beinteger.Convert factors to character vectors. If both are factors, but with different levels,
bind_rowswill still fail.If you need these columns to be factors, refactor them after you bind rows.