2016-08-25 4 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 с уменьшены до минимального размера в столбцах и строках, присутствующие в любом 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 
Смежные вопросы