[英]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.