r - dplyr bind_rows 改变类型以匹配

标签 r dplyr

假设我有两个简单的数据框,如下所示:

stuff <- data.frame('a', 'b')
col1 <- c(1,2,3)
stuff <- data.frame(col1)
col1 <- c('1','2', '3')
stuff2 <- data.frame(col1)

我想将它们合并到一个数据框中,并尝试使用 dplyrbind_rows ,例如像这样:
bind_rows(stuff, stuff2)

但是(不出所料)我得到了

Error in bind_rows_(x, .id) : Column col1 can't be converted from numeric to factor



有没有办法告诉我bind_rows将行突变为目标(或尝试)?

最佳答案

我会使用 data.table 的 rbindlist ...
由于此功能需要一个列表作为输入,您将自动丢失字符因素问题...

rbindlist 还有一些让生活更轻松的功能(而且速度也非常快!)

#lets make'a named list
l <- list( stuff = stuff, stuff2 = stuff2 ) 
#now bind the two df's together
library(data.table)
rbindlist( l, use.names = TRUE )
#    col1
# 1:    1
# 2:    2
# 3:    3
# 4:    1
# 5:    2
# 6:    3

当你想要更多的功能时,更好的东西就会出现……假设你想知道哪些数据来自哪个 df……这里名称列表开始发挥作用
rbindlist( l, use.names = TRUE, idcol = TRUE )
#      .id col1
#1:  stuff    1
#2:  stuff    2
#3:  stuff    3
#4: stuff2    1
#5: stuff2    2
#6: stuff2    3

或者,当并非所有列名都存在于所有 df 中时:
col2 <- c('1','2', '3')
stuff2 <- data.frame(col2)
rbindlist( l, use.names = TRUE, fill = TRUE, idcol = "origin" )
#    origin col1 col2
# 1:  stuff    1 <NA>
# 2:  stuff    2 <NA>
# 3:  stuff    3 <NA>
# 4: stuff2   NA    1
# 5: stuff2   NA    2
# 6: stuff2   NA    3

如果列名不相同,但您仍想将两个 df 放入一列:
col1 <- c(1,2,3)
stuff <- data.frame(col1)
col2 <- c('1','2', '3')
stuff2 <- data.frame(col2)
#create a named list
l <- list(stuff = stuff, stuff2 = stuff2) 
rbindlist( l )

#    col1
# 1:    1
# 2:    2
# 3:    3
# 4:    1
# 5:    2
# 6:    3

关于r - dplyr bind_rows 改变类型以匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51256486/

相关文章:

r - 提取所有列组中共有的元素

python - rpy2 下的立体回归 : "subscript out of bounds" error

r - 将列添加到显示变量频率的数据框中

r - 如何使用 dplyr::mutate_all 对选定列进行舍入

R dplyr在分组后在两行之间划分

python - 比较 2 个文件并提取不同的行

r - 采购后清理全局环境 : How to remove objects of a certain type in R

用行值替换变量名,反之亦然

r - 匹配特定列中的前一行并在 R 中执行计算

r - 如何使用 dplyr 在 R 中以 "cascading"为基础计算一个值