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