我有一个数据框列表,只有几个共同的列。我有一个列向量希望保留。但是,有些数据框恰好具有那些列,有些则缺少其中的几列。
如果每个数据框都包含相同的列,则只需使用subset(df, select = c("column", "names"))
选择感兴趣的列。但是,如何只选择存在的列?
我有一个虚拟的示例,但是我希望在列表上使用map
或lapply
函数,因为我的真实数据中有很多数据框。
我的虚拟示例:
df1<- data.frame(a = seq(0,5),
b = seq(5,10),
cc = seq(10,15))
df2<- data.frame(a = seq(0,5),
b = seq(5,10),
d = seq(10,15))
ls <-list(df1, df2)
# select columns, "cc" column is missing from df2
keep<-c("b", "cc")
如何修改此功能以仅选择数据框中存在的列?
lapply(ls, function(x) subset(x, select = keep) )
列数不均匀的预期输出:
[[1]]
b cc
1 5 10
2 6 11
3 7 12
4 8 13
5 9 14
6 10 15
[[2]]
b
1 5
2 6
3 7
4 8
5 9
6 10
答案 0 :(得分:2)
您可以使用intersect
函数:
> intersect(c("a", "b", "c"), c("a", "b"))
[1] "a" "b"
即像这样修改您的功能:
> lapply(ls, function(x) subset(x, select = intersect(keep, colnames(x))))
[[1]]
b cc
1 5 10
2 6 11
3 7 12
4 8 13
5 9 14
6 10 15
[[2]]
b
1 5
2 6
3 7
4 8
5 9
6 10