cbind包含不同列数的数据帧

时间:2018-03-27 00:58:14

标签: r dataframe cbind

我有几个数据帧包含大致相同的变量,但某些数据帧中缺少某些变量。我想在缺少的字段中创建NA值时cbind(*的一个特定列)数据帧。举例来说:

d1 <- data.frame(y1 = c("var1", "var2", "var3"),
                 y2 = c(3, 2, 4),
                 y3 = c("not_needed", "not_needed2", "not_needed3"))
d2 <- data.frame(y1 = c("var1", "var3"),
                 y2 = c(2, 1),
                 y3 = c("not_needed", "not_needed2"))
d3 <- data.frame(y1 = c("var1", "var2", "var4"),
                 y2 = c(3, 2, 5),
                 y3 = c("not_needed", "not_needed2", "not_needed3"))

expected_output <- data.frame(y1 = c("var1", "var2", "var3", "var4"),
                              y2.d1 = c(3, 2, 4, NA),
                              y2.d2 = c(2, NA, 1, NA),
                              y2.d3 = c(3, 2, NA, 5))

*输出数据框中不需要列y3

我已尝试rbind.fill()来自plyr以及其他一些想法,但到目前为止还没有成功。

@joran我不相信这是链接问题的重复,因为我不是要合并整个数据框,只是每个数据框的一列。我很欣赏答案可能在某处,但没有特别提及。

1 个答案:

答案 0 :(得分:3)

使用的解决方案。我们可以将所有数据框放在一个列表中,然后使用中的函数来合并它。请注意,我在创建示例数据帧时使用stringsAsFactors = FALSE来阻止因子列。

library(tidyverse)

d_list <- list(d1, d2, d3)

d_final <- d_list %>%
  map(select, y1, y2) %>%
  reduce(full_join, by = "y1") %>%
  setNames(c("y1", paste0("y2.d", 1:3)))

d_final
#     y1 y2.d1 y2.d2 y2.d3
# 1 var1     3     2     3
# 2 var2     2    NA     2
# 3 var3     4     1    NA
# 4 var4    NA    NA     5

数据

d1 <- data.frame(y1 = c("var1", "var2", "var3"),
                 y2 = c(3, 2, 4),
                 y3 = c("not_needed", "not_needed2", "not_needed3"),
                 stringsAsFactors = FALSE)
d2 <- data.frame(y1 = c("var1", "var3"),
                 y2 = c(2, 1),
                 y3 = c("not_needed", "not_needed2"),
                 stringsAsFactors = FALSE)
d3 <- data.frame(y1 = c("var1", "var2", "var4"),
                 y2 = c(3, 2, 5),
                 y3 = c("not_needed", "not_needed2", "not_needed3"),
                 stringsAsFactors = FALSE)