将列添加到数据框列表内的元素

时间:2020-02-06 16:46:42

标签: r list apply

我有一个数据帧列表,其中一些有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))

4 个答案:

答案 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)

使用lapplyis.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