R lapply:检查数据框是否包含列。如果没有,请创建此列

时间:2018-05-11 00:06:34

标签: r

我有一个数据框列表。

我想检查数据帧的每个列名。如果缺少列名,我想将此列创建到数据帧,并使用NA值完成。

虚拟数据:

d1 <- data.frame(a=1:2, b=2:3, c=4:5)
d2 <- data.frame(a=1:2, b=2:3)

l<-list(d1, d2)

# Check the columns names of the dataframes 
# If column is missing, add new column, add NA as values 
lapply(l, function(x) if(!("c" %in% colnames(x))) 
             {
              c<-rep(NA, nrow(x))
              cbind(x, c) # does not work!
              })

我得到了什么:

[[1]]
NULL

[[2]]
  a b  c
1 1 2 NA
2 2 3 NA

我想要的是:

[[1]]
  a b c
1 1 2 4
2 2 3 5

[[2]]
  a b c
1 1 2 NA
2 2 3 NA

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您可以将dplyr::mutateifelse

一起使用
library(dplyr)
lapply(l, function(x) mutate(x, c = ifelse("c" %in% names(x), c, NA)))

[[1]]
  a b c
1 1 2 4
2 2 3 4

[[2]]
  a b  c
1 1 2 NA
2 2 3 NA

答案 1 :(得分:2)

一种方法是使用dplyr::bind_rows绑定data.frame中的list,并使用NA填充缺失列中的条目,然后拆分生成的data.frame再次生成list data.frame s:

df <- dplyr::bind_rows(l, .id = "id");
lapply(split(df, df$id), function(x) x[, -1])
#$`1`
#  a b c
#1 1 2 4
#2 2 3 5
#
#$`2`
#  a b  c
#3 1 2 NA
#4 2 3 NA

或与tidyverse / magrittr

相同
bind_rows(l, .id = "id") %>% split(., .$id) %>% lapply(function(x) x[, -1])