我有一个数据帧列表,其中一些有need
列,而另一些则没有。如何将need
列添加到其他数据帧(值= NA
)?我尝试使用Map或lapply
test <- list(data.frame(need = NA, dont_need = NA),
data.frame(dont_need = NA),
data.frame(dont_need = NA, dont_need_2 = NA))
[[1]]
need dont_need
1 NA NA
[[2]]
dont_need need
1 NA NA
[[3]]
dont_need dont_need_2 need
1 NA NA NA
我不能仅使用绑定,因为此列表是动态创建的,有时仅包含一个没有need
列的数据框。在这种情况下,答案也必须有效:
test_2 <- list(data.frame(dont_need = NA))
答案 0 :(得分:3)
在仅有空元素的情况下,一种purrr
可能性是:
map(test, ~ list_modify(., need = NA))
[[1]]
need dont_need
1 NA NA
[[2]]
dont_need need
1 NA NA
[[3]]
dont_need dont_need_2 need
1 NA NA NA
如果可能存在现有的非空元素:
map(test, ~ if(!"need" %in% names(.)) update_list(., need = NA) else .)
答案 1 :(得分:1)
使用lapply
和is.null
的另一个版本。我在开头的data.frame
中添加了一些实际值,以表明如果最初存在则保留它们。
test <- list(data.frame(need = c(NA, 2), dont_need = 1:2),
data.frame(dont_need = 1:3),
data.frame(dont_need = 1:3, dont_need_2 = NA))
> [[1]]
> need dont_need
> NA 1
> 2 2
>
> [[2]]
> dont_need
> 1
> 2
> 3
>
> [[3]]
> dont_need dont_need_2
> 1 NA
> 2 NA
> 3 NA
test <- lapply(test, function(df) {
if (is.null(df[["need"]]))
df[["need"]] <- NA
df
})
> [[1]]
> need dont_need
> NA 1
> 2 2
>
> [[2]]
> dont_need need
> 1 NA
> 2 NA
> 3 NA
>
> [[3]]
> dont_need dont_need_2 need
> 1 NA NA
> 2 NA NA
> 3 NA NA
答案 2 :(得分:0)
这是使用lapply
的直接方法:
test <- list(data.frame(need = NA, dont_need = NA),
data.frame(dont_need = NA),
data.frame(dont_need = NA, dont_need_2 = NA))
lapply(test, function(df) {
if (!"need" %in% colnames(df)) {
df$need <- NA
}
return(df)
})
#> [[1]]
#> need dont_need
#> 1 NA NA
#>
#> [[2]]
#> dont_need need
#> 1 NA NA
#>
#> [[3]]
#> dont_need dont_need_2 need
#> 1 NA NA NA
由reprex package(v0.3.0)于2020-02-06创建
答案 3 :(得分:0)
您可以编写一个函数来检查data.frame
中每个need
的列名,如果不存在则创建它。
test2 <- lapply(test, function(x) {
if(!"need"%in% colnames(x)){
x$need <- NA
}
return(x)
})
[[1]]
need dont_need
1 NA NA
[[2]]
dont_need need
1 NA NA
[[3]]
dont_need dont_need_2 need
1 NA NA NA