簡體   English   中英

從 R 中的數據框列表左連接

[英]Left join from list of data frames in R

我有一些這樣的數據集:

data_201401 <- data.frame(ID = c(123, 234, 345, 456), Block_Code = c("D", "U", "Z", "G"),
                     DPP = c(1,2,3,4))

data_201402 <- data.frame(ID = c(123, 234, 345, 456, 678), Block_Code = c("Z", "G", "T", "D", "U" ),
                     DPP = c(2,3,1,4,5))

data_201403 <- data.frame(ID = c(123, 234, 345, 456,678,124), 
                     Block_Code = c("U", "Z","G","T", "D","R"),DPP = c(6,2,2,4,5,6))

data_201404 <- data.frame(ID = c(123, 234, 345, 456, 678, 124, 567), 
                     Block_Code = c("D", "U", "Z", "G","T","R","Z"),DPP = c(1,2,3,4,5,6,7))

data_201405 <- data.frame(ID = c(123, 234, 345, 456, 678, 124, 567, 256), 
                     Block_Code = c("D", "U", "Z","G","T","R","Z","U"), DPP = c(1,2,3,4,5,6,7,8))

data_201406 <- data.frame(ID = c(123, 234, 345, 456, 678, 124, 567, 256, 345), 
                     Block_Code = c("D", "U","Z", "G","T","R","Z","U", "Z"),
                     DPP = c(1,2,3,4,5,6,7,8,2))
data_201407 <- data.frame(ID = c(123, 234, 345, 456,  678, 124, 567, 256, 345, 647), 
                     Block_Code = c("D", "U", "Z", "G","T","R","Z","U", "Z","S"), 
                     DPP = c(1,2,3,4,5,6,7,8,2,12))

依此類推,直到 data_201506。

我希望 data_201401 之后與 12 個數據集合並,data_201402 直到 data_201501。 我希望 data_201402 之后與 12 個數據集合並,data_201403 直到 data_201502。 我希望 data_201403 之后與 12 個數據集合並,data_201404 直到 data_201503。 我希望 data_201404 之后與 12 個數據集合並,data_201405 直到 data_201504。 我希望 data_201405 之后與 12 個數據集合並,data_201406 直到 data_201505。 我希望 data_201406 之后與 12 個數據集合並,data_201407 直到 data_201506。

在 data_201404 之后直到 data_201406 完成每次合並。 所以像 Block_Code 一樣有 13 列。 我還想重命名 BLock_code,就像初始數據集仍然是相同的“Block_Code”一樣,但是對於合並的 12 個數據幀是 Block_Code_1、Block_Code_2、...、Block_Code_12。

有人可以幫我在 R 中做到這一點嗎?我不知道它會像循環和嵌套循環一樣工作

在此處輸入圖像描述

也許從圖片中可以看出我的意思

在此處輸入圖像描述

這是一種方法。
使用mget獲取列表中的數據集。 遍歷列表並使用merge它們連接起來,將結果Reduce到一個數據集。 根據要求,結果有ndatasets Block_Codes。

data_list <- mget(ls(pattern = "data_201"))

ndatasets <- 3L

res_list <- lapply(seq_along(data_list)[-(1:2)], \(inx) {
  i <- inx - ndatasets:1 + 1L
  out <- Reduce(\(x, y) merge(x, y, by = "ID"), data_list[i])
  # take care of the column names
  icols <- grep("Block_Code", names(out))
  names(out)[icols] <- paste0("Block_Code_", seq_along(icols))
  icols <- grep("DPP", names(out))
  names(out)[icols] <- paste0("DPP_", seq_along(icols))
  out
})

res_list
#> [[1]]
#>    ID Block_Code_1 DPP_1 Block_Code_2 DPP_2 Block_Code_3 DPP_3
#> 1 123            D     1            Z     2            U     6
#> 2 234            U     2            G     3            Z     2
#> 3 345            Z     3            T     1            G     2
#> 4 456            G     4            D     4            T     4
#> 
#> [[2]]
#>    ID Block_Code_1 DPP_1 Block_Code_2 DPP_2 Block_Code_3 DPP_3
#> 1 123            Z     2            U     6            D     1
#> 2 234            G     3            Z     2            U     2
#> 3 345            T     1            G     2            Z     3
#> 4 456            D     4            T     4            G     4
#> 5 678            U     5            D     5            T     5
#> 
#> [[3]]
#>    ID Block_Code_1 DPP_1 Block_Code_2 DPP_2 Block_Code_3 DPP_3
#> 1 123            U     6            D     1            D     1
#> 2 124            R     6            R     6            R     6
#> 3 234            Z     2            U     2            U     2
#> 4 345            G     2            Z     3            Z     3
#> 5 456            T     4            G     4            G     4
#> 6 678            D     5            T     5            T     5
#> 
#> [[4]]
#>    ID Block_Code_1 DPP_1 Block_Code_2 DPP_2 Block_Code_3 DPP_3
#> 1 123            D     1            D     1            D     1
#> 2 124            R     6            R     6            R     6
#> 3 234            U     2            U     2            U     2
#> 4 345            Z     3            Z     3            Z     3
#> 5 345            Z     3            Z     3            Z     2
#> 6 456            G     4            G     4            G     4
#> 7 567            Z     7            Z     7            Z     7
#> 8 678            T     5            T     5            T     5
#> 
#> [[5]]
#>     ID Block_Code_1 DPP_1 Block_Code_2 DPP_2 Block_Code_3 DPP_3
#> 1  123            D     1            D     1            D     1
#> 2  124            R     6            R     6            R     6
#> 3  234            U     2            U     2            U     2
#> 4  256            U     8            U     8            U     8
#> 5  345            Z     3            Z     3            Z     3
#> 6  345            Z     3            Z     3            Z     2
#> 7  345            Z     3            Z     2            Z     3
#> 8  345            Z     3            Z     2            Z     2
#> 9  456            G     4            G     4            G     4
#> 10 567            Z     7            Z     7            Z     7
#> 11 678            T     5            T     5            T     5

創建於 2022-10-02,使用reprex v2.0.2

暫無
暫無

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

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