Объединить два списка фреймов данных - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть два списка фреймов данных. Каждый список имеет 6 кадров данных. Кадры данных имеют те же столбцы, но в списке1 данные имеют данные с 2015 по 2017 год, а список 2 - с 2018. Как показано ниже

List1 $ A

Name Value  Year
AAA  123   2015
BBB  456   2016
CCC  789   2017
AAA  543   2018

List2 $ A

Name Value  Year
AAA  543    2018
BBB  248    2018

Я хочу объединить кадры данных из обоих списков. Итак, в конце я хочу получить только один список данных со всей информацией за все годы.

Некоторые кадры данных из list1 уже содержат информацию о 2018 году, поэтому, когда я объединяю их с другими, я хочу, чтобы эти значения 2018 были заменены.

Newlist $ A

Name Value  Year
AAA  123    2015
BBB  456    2016
CCC  789    2017
AAA  543    2018
BBB  248    2018

Я попробовал это, но не сработало

data<- lapply(list1,list2, function (x,y) merge(x,y))

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Мы могли бы сначала связать все в длинный фрейм данных и удалить записи для "2018", которые сначала появляются, если в списке 2 есть запись.

Для этого мы могли бы list списки и rbind их после добавления столбца ID, который позже помогает удалить дубликаты года "2018", которые происходят из списка 1 с by / ave, но сохраняют те, которых нет в списке 2.

Уловка последнего заключается в том, что нам rev(seq_along(x)).

Чтобы продемонстрировать, что я создал образцы данных, которые, вероятно, напоминают ваши данные.

# list the lists
L <- list(L1=L1, L2=L2)

# add id column to sublists
L <- lapply(seq(L), function(x) 
  Map(`[<-`, L[[x]], "list", value=substr(names(L)[x], 2, 2)))

# rbind lists to long data frame
d <- do.call(rbind, unlist(L, recursive=FALSE))

# remove 2018 duplicates of list L1, keep if no 2018 in list L2
do.call(rbind, by(d, d$name, function(y) {
  i <- cbind(y, id=ave(y$year, y$year, FUN=function(z) rev(seq_along(z))))
  i[!i$id == 2, ]
  }))

Результат

#        name value year list id
# A.A.1     A   998 2015    1  1
# A.A.4     A   456 2016    1  1
# A.A.7     A   312 2017    1  1
# A.A.13    A   478 2018    2  1
# B.A.2     B  1592 2015    1  1
# B.A.5     B  1072 2016    1  1
# B.A.8     B   673 2017    1  1
# B.A.21    B   445 2018    2  1
# C.A.3     C   957 2015    1  1
# C.A.6     C   199 2016    1  1
# C.A.9     C  2165 2017    1  1
# C.A.31    C   342 2018    2  1
# D.B.1     D   877 2015    1  1
# D.B.4     D   876 2016    1  1
# D.B.7     D   482 2017    1  1
# D.B.13    D  1077 2018    2  1
# E.B.2     E   370 2015    1  1
# E.B.5     E  1475 2016    1  1
# E.B.8     E   768 2017    1  1
# E.B.11    E   385 2018    1  1  <- this stems from list 1!
# F.B.3     F   421 2015    1  1
# F.B.6     F   930 2016    1  1
# F.B.9     F  1105 2017    1  1
# F.B.31    F  1836 2018    2  1

Данные

l1 <- list(A = structure(list(name = structure(c(1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    value = c(1371, 565, 363, 633, 404, 106, 1512, 95, 2018, 
    63, 1305, 2287), year = c(2015L, 2015L, 2015L, 2016L, 2016L, 
    2016L, 2017L, 2017L, 2017L, 2018L, 2018L, 2018L)), class = "data.frame", row.names = c(NA, 
-12L)), B = structure(list(name = structure(c(1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("D", "E", "F"), class = "factor"), 
    value = c(1389, 279, 133, 636, 284, 2656, 2440, 1320, 307, 
    1781, 172, 1215), year = c(2015L, 2015L, 2015L, 2016L, 2016L, 
    2016L, 2017L, 2017L, 2017L, 2018L, 2018L, 2018L)), class = "data.frame", row.names = c(NA, 
-12L)))

L2 <- list(A = structure(list(name = structure(1:3, .Label = c("A", 
"B", "C"), class = "factor"), value = c(1895, 430, 257), year = c(2018, 
2018, 2018)), class = "data.frame", row.names = c(NA, -3L)), 
    B = structure(list(name = structure(c(1L, 3L), .Label = c("D", 
    "E", "F"), class = "factor"), value = c(1763, 640), year = c(2018, 
    2018)), row.names = c(1L, 3L), class = "data.frame"))

L2$B <- L2$B[-2, ]  # remove intentionally value
0 голосов
/ 30 апреля 2019

Всегда полезно включать выборку данных с dput, но вот попытка без подтверждения данных:

library(tidyverse)

map2(list1, list2, ~bind_rows(.y, .x) %>% group_by(Name, Year) %>% slice(1))

Мы связываем строки (сначала list2), затем группируем поName и Year и взятие первого вхождения с slice, которое должно принимать первое значение для любых Name / Year повторных измерений из 2-го кадра данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...