[英]Merge list of dataframe in R
我在 R 中有一個 dataframe 的列表,例如:
w = list(structure(list(var = structure(c(1L, 1L, 2L, 3L), .Label = c("A",
"B", "C"), class = "factor"), val = 1:4), class = "data.frame", row.names = c(NA,
-4L)), structure(list(var = structure(c(1L, 2L, 3L, 1L), .Label = c("A",
"B", "C"), class = "factor"), val = 101:104), class = "data.frame", row.names = c(NA,
-4L)))
我想通過var
合並那些 dataframe 。 試:
Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "var", all.x = T),w)
var val.x val.y
1 A 1 101
2 A 1 104
3 A 2 101
4 A 2 104
5 B 3 102
6 C 4 103
但這不是我要找的:我希望結果為:
var val val.x
A 1 101
A 2 104
B 3 102
C 4 103
您通過每個組中的行 ID 隱式加入。 將其設為顯式變量會使事情變得更容易。
創建該變量的一種簡單方法是data.table::rowid()
:
w <- lapply(w, function(x) {x$id <- data.table::rowid(x$var); x})
Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = c("var", "id"), all.x = T), w)
var id val.x val.y
1 A 1 1 101
2 A 2 2 104
3 B 1 3 102
4 C 1 4 103
您可以在每個列表中創建一個單獨的id
列,然后將它們merge
在一起。
Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = c("var", "id"), all.x = TRUE),
lapply(w, function(x) transform(x, id = ave(val, var, FUN = seq_along))))
# var id val.x val.y
#1 A 1 1 101
#2 A 2 2 104
#3 B 1 3 102
#4 C 1 4 103
在tidyverse
中,可以使用相同的邏輯:
library(dplyr)
library(purrr)
map(w, ~.x %>% group_by(var) %>% mutate(id = row_number())) %>%
reduce(left_join, by = c("var", "id"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.