组合不同维度的列表元素

时间:2019-12-02 02:58:30

标签: r

我有一个清单。它包含20个元素。第一个元素有630列,其余元素有3530列。 3530列包含630列。每个元素有12行。我想以第一个元素包含3530列(其中630列带有NA的数据列)的方式组合此列表。我用ldply。但是经过前12次观察后,它填补了各地缺少的数据。

2 个答案:

答案 0 :(得分:1)

由于不完整的数据(列)仅出现在列表的第一个元素中,因此我们只能对此进行处理。假设您的列表名为list_df,请尝试

list_df[[1]][setdiff(names(list_df[[2]]), names(list_df[[1]]))] <- NA

例如,基于此数据

df1 <- data.frame(a = 1:5, b = 3:7)
df2 <- data.frame(a = 1:5, b = 3:7, c = 13:17, d = 16:20)
df3 <- data.frame(a = 1:5, b = 3:7, c = 13:17, d = 16:20)
list_df <- list(df1, df2, df3)

list_df[[1]][setdiff(names(list_df[[2]]), names(list_df[[1]]))] <- NA

list_df
#[[1]]
#  a b  c  d
#1 1 3 NA NA
#2 2 4 NA NA
#3 3 5 NA NA
#4 4 6 NA NA
#5 5 7 NA NA

#[[2]]
#  a b  c  d
#1 1 3 13 16
#2 2 4 14 17
#3 3 5 15 18
#4 4 6 16 19
#5 5 7 17 20

#[[3]]
#  a b  c  d
#1 1 3 13 16
#2 2 4 14 17
#3 3 5 15 18
#4 4 6 16 19
#5 5 7 17 20

如果需要,您可以这样做将数据合并到一个数据帧中

do.call(rbind, list_df)

如果您使用dplyr bind_rows,则会自动将NA添加到不存在的列中。

dplyr::bind_rows(list_df)

答案 1 :(得分:0)

使用Reduce函数对列表中的所有元素应用完全外部联接的Base R解决方案:

df <- Reduce(function(x, y){

  merge(x, y, by = intersect(colnames(x), colnames(y)), all = TRUE)},

  df_list)