簡體   English   中英

合並兩個數據框列表

[英]Merge two lists of data frames

我有兩個數據框列表。 每個列表有6個數據幀。 數據框具有相同的列,但在list1中,數據框具有2015年至2017年的信息,而list2的信息為2018。如下所示

列表1 $ A

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

列表2 $ 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))

我怎樣才能做到這一點?

使用dput包含數據樣本總是有幫助的,但這是一次沒有數據確認的嘗試:

library(tidyverse)

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

我們綁定行(首先使用list2 ),然后按NameYear進行分組,並使用slice進行第一次出現,這應該取第2個數據幀中任何Name / Year重復度量的第一個值。

我們可以先將所有內容綁定到一個長數據幀中,並刪除第一個出現的"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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM