2016-08-25 88 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