我有一个数据框列表。
我想检查数据帧的每个列名。如果缺少列名,我想将此列创建到数据帧,并使用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
感谢您的帮助!
答案 0 :(得分:3)
您可以将dplyr::mutate
与ifelse
:
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])