在R中相交数据帧列表

时间:2016-08-25 11:01:51

标签: r

R中的函数是否与具有不同列数的多个数据帧的列表相交并返回具有匹配列的多个数据帧的列表?

作为一个例子,我有以下列表:

ll <- list(structure(list(V1 = c(8L, 2L, 7L), V2 = c(1L, 9L, 3L), V3 = 4:6), .Names = c("V1", "V2", "V3"), row.names = c(NA, -3L), class = "data.frame"), structure(list(V1 = c(1L, 3L, 2L), V2 = c(5L, 4L, 6L)), .Names = c("V1", "V2"), row.names = c(NA, -3L), class = "data.frame"))

> ll
[[1]]
  V1 V2 V3
1  8  1  4
2  2  9  5
3  7  3  6

[[2]]
  V1 V2
1  1  5
2  3  4
3  2  6

结果列表应该给出:

> new.ll
[[1]]
  V1 V2
1  8  1
2  2  9
3  7  3

[[2]]
  V1 V2
1  1  5
2  3  4
3  2  6

感谢。

2 个答案:

答案 0 :(得分:3)

应该有更好的选择。但是,现在我只能想到这一点。

mincol <- Reduce(intersect, lapply(ll, colnames))
lapply(ll, function(x) x[mincol])

#[[1]]
#  V1 V2
#1  8  1
#2  2  9
#3  7  3

#[[2]]
#  V1 V2
#1  1  5
#2  3  4
#3  2  6

使用intersect查找常用列名,然后仅选择列表中所有数据框的列名。

答案 1 :(得分:1)

一种解决方案,不是基于列名,而是基于列数(从第一列开始)。所有data.frame都缩减为任何data.frame中的列和行中的最小尺寸:

ll_new <- lapply(ll, function(y) y[1:min(sapply(ll, function(x) dim(x)[1])), #min number of rows
                                   1:min(sapply(ll, function(x) dim(x)[2])]) #min number of cols