Как объединить два списка наиболее разных фреймов данных и связать строки этих фреймов с одинаковыми именами в R? - PullRequest
2 голосов
/ 17 января 2020

У меня есть два разных списка данных. Некоторые кадры данных в двух списках имеют одинаковые имена, а другие - нет. Когда я объединяю два списка, мне нужно объединить кадры данных с одинаковыми именами в стиле rbind, а также те, которые являются уникальными в обоих списках, чтобы оставаться как уникальные кадры данных и привязываться к недавно созданному объединенному списку кадров данных.

В списке list1, скорее всего, будет больше кадров данных и больше строк на кадр данных, чем в list2, поскольку он будет кумулятивно связанным списком в результате al oop. List2 - это новый результат каждого l oop, который будет добавлен в накопительный список 1.

Пример макета:

mydf1 <- data.frame(V1=1, V2=rep("A", 4)) 
mydf2 <- data.frame(V1=1, V2=rep("B", 3))
mydf3 <- data.frame(V1=1, V2=rep("C", 2))

mydf4 <- data.frame(V1=2, V2="A")
mydf5 <- data.frame(V1=3, V2="C")
mydf6 <- data.frame(V1=4, V2="D")
mydf7 <- data.frame(V1=7, V2="E")

list1 <- list(AA=mydf1, BB=mydf2, CC=mydf3)
list2 <- list(AA=mydf4, CC=mydf5, DD=mydf6, EE=mydf7)

Ожидаемый результат:

$AA
  V1 V2
1  1  A
2  1  A
3  1  A
4  1  A
1  2  A

$BB
  V1 V2
1  1  B
2  1  B
3  1  B

$CC
  V1 V2
1  1  C
2  1  C
1  3  C

$DD
  V1 V2
1  4  D

$EE
  V1 V2
1  7  E

I пробовал с решением здесь , но не смог заставить их работать должным образом.

Это решение не собирает правильные кадры данных и создает другие странные комбинации.

(m <- match(names(list2), names(list1), nomatch = 0L))
# [1] 1 1 2
Map(rbind, list1[m], list2)

и этот, кажется, просто никогда не привязывает кадры данных с одинаковыми именами, все кадры данных просто сохраняют 1 строку.

stackMe <- function(x) {
  a <- eval.parent(quote(names(X)))[substitute(x)[[3]]]
  rbind(list1[[a]], x)
} 
lapply(list2, stackMe)

Как объединить два списка фреймов данных, в которых эти фреймы с одинаковым именем просто добавляют / связывают строки, а другие уникальные фреймы данных просто добавляются в список?

1 Ответ

1 голос
/ 17 января 2020

Мы можем использовать индексирование с Map

list1[names(list2)] <- Map(rbind, list1[names(list2)], list2)
list1
#$AA
#  V1 V2
#1  1  A
#2  1  A
#3  1  A
#4  1  A
#5  2  A

#$BB
#  V1 V2
#1  1  B
#2  1  B
#3  1  B

#$CC
#  V1 V2
#1  1  C
#2  1  C
#3  3  C

#$DD
#  V1 V2
#1  4  D

#$EE
#  V1 V2
#1  7  E
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...