Как эффективно объединить объект data.frame в нескольких списках без дублирования?

#r #list #dataframe

#r #Список #dataframe

Вопрос:

У меня есть объекты data.frame в нескольких списках, где существует некоторое дублирование. Тем не менее, я намерен объединить эти объекты data.frame без дублирования в один список. Я попробовал несколько способов получить ожидаемый результат, но не могу понять, как объединить объект data.frame в нескольких списках. Потому что в каждом списке порядок объектов data.frame сильно отличается. Кто-нибудь знает какой-нибудь трюк, позволяющий легко выполнить эту манипуляцию? Как это может произойти? есть идеи? Заранее благодарю.

Это быстрый воспроизводимый пример для запуска:

мини-пример:

 myList_1 <- list(
  foo = data.frame(from=c(2,7,11,19), to=c(5,10,14,24), label=c("a1","a3","a5","a8"), score=c(2,5,8,12)),
  bar = data.frame(fom=c(12,17,21), to=c(15,19,25),label=c("b2","b3","b5"), score=c(7,3,6)),
  cat = data.frame(from=c(3,9,17,27), to=c(5,13,21,42),lable=c("c1","c3","c6", "c11"), score=c(5,2,4,9))
)

myList_2 <- list(
  bar = data.frame(from=c(7,12,27), to=c(10,15,36),label=c("b1","b2","b7"), score=c(4,7,11)),
  foo = data.frame(from=c(19,31,48), to=c(24,37,59),label=c("a8","a10","a15"), score=c(12,3,7)),
  cat = data.frame(from=c(6,17,22,27), to=c(12,21,25,42),label=c("c2","c6","c7","c11"), score=c(3,6,1,9))
)

myList_3 <- list(
  cat = data.frame(from=c(17,22, 45), to=c(21,25,58),label=c("c6","c7","c17"), score=c(4,1,5)),
  foo = data.frame(from=c(11,19,31,63), to=c(14, 24,37,71),label=c("a5","a8","a10","a19"), score=c(8,12,3,5)),
  bar = data.frame(from=c(27,57,72), to=c(36,66,83),label=c("b7","b14","b22"), score=c(11,2,8))
)
  

мой желаемый результат :

 myList <- list(
  foo = data.frame(from=c(2,7,11,19,31,48,63),to=c(5,10,14,24,37,59,71),
                   label=c("a1","a3","a5","a8","a10","a15","a19"), score=c(2,5,8,12,3,7,5)),
  bar = data.frame(from=c(7,12,17,21,27,57,72),to=c(10,15,19,25,36,66,83),
                   label=c("b1","b2","b3","b5","b7","b14","b22"), score=c(4,7,3,6,11,2,8)),
  cat = data.frame(from=c(3,6,9,17,22,27,45),to=c(5,12,13,21,25,42,58),
                   label=c("c1","c2","c3","c6","c7","c11","c17"), score=c(5,3,2,4,1,9,5))
)
  

Как я могу получить свой результат более легко и эффективно? Как я могу достичь желаемого результата ? Большое спасибо

Комментарии:

1. Я думаю, что есть опечатка? в вашем входном наборе lable данных вместо label

Ответ №1:

Мы можем сделать это с Map помощью . Получите names первый список (‘myList_1’) и используйте его для подмножества других элементов списка, чтобы он был в том же порядке. Затем мы rbind используем соответствующие data.frames для каждого list элемента Map .

 nm1 <- names(myList_1)
Map(rbind, myList_1, myList_2[nm1], myList_3[nm1])
  

Комментарии:

1. @Andy. Цзянь, это из base R . Я нахожу некоторые опечатки в именах столбцов в вашем входном наборе данных. Это намеренно или случайно

2. @Andy. Цзянь Имена расположены в разном порядке, и это исправляется путем подмножества. использование myList_2[nm1] , но тот, о котором я говорю fom , вместо from , lable вместо label

3. @Andy. Цзянь вы можете использовать map вместо Map with purrr , но я не нахожу большого преимущества

4. @Andy. Цзянь, Ты можешь сделать это с помощью nm1 <- sort(names(myList_1))

5. @Andy. Цзянь, у меня возникли проблемы с вашим набором данных, возможно, попробуйте Map(function(x,y,z) unique(rbind(x,y,z)), myList_1, my_List_2[nm1], myList_3[nm1])