2016-08-25 10 views
0

異なる数の列を持つ複数のデータフレームのリストと交差し、一致する列を持つ複数のデータフレームのリストを返す関数がRにありますか?結果のリストは与えるべき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を使用して、共通のカラム名を検索して、リスト内のすべてのデータフレーム間でのみ列名を選択します。

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