2016-08-25 110 views
0

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 

感谢。

+0

匹配仅基于列** **名? –

+0

匹配是否意味着从第一列开始,所有列都有相同的列数? – Phann

+0

是的,匹配是基于列名的,是的,匹配意味着所有的列都是相同的。 – alaj

回答

2

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

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找出共同的列名称,然后选择只提供整个列表中的所有dataframes那些列名。

1

不是基于列名称,而是基于列数(从第一列开始)的解决方案。所有data.frame s的减少在列和行目前最小尺寸的任何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