R 在列表中合并数据帧

R 在列表中合并数据帧,r,merge,R,Merge,这是一个早期讨论的分支,该讨论围绕简化我的函数和消除合并由lappy产生的数据帧的需要展开。虽然像dplyr和data.table这样的工具消除了合并的需要,但我还是想知道在这种情况下如何合并。我已将基于此生成列表的函数简化为上一个问题 #Reproducible data Data <- data.frame("custID" = c(1:10, 1:20), "v1" = rep(c("A", "B"), c(10,20)), "v2" = c(30:21, 20:1

这是一个早期讨论的分支,该讨论围绕简化我的函数和消除合并由
lappy
产生的数据帧的需要展开。虽然像
dplyr
data.table
这样的工具消除了合并的需要,但我还是想知道在这种情况下如何合并。我已将基于此生成列表的函数简化为上一个问题

#Reproducible data
Data <- data.frame("custID" = c(1:10, 1:20),
    "v1" = rep(c("A", "B"), c(10,20)), 
    "v2" = c(30:21, 20:19, 1:3, 20:6), stringsAsFactors = TRUE)

#Split-Apply function
res <- lapply(split(Data, Data$v1), function(df) {
    cutoff <- quantile(df$v2, c(0.8, 0.9))
    top_pct <- ifelse(df$v2 > cutoff[2], 10, ifelse(df$v2 > cutoff[1], 20, NA))
    na.omit(data.frame(custID = df$custID, top_pct))
    })
我希望结果如下所示:

  custID A_top_pct B_top_pct
1      1        10        10
2      2        20        20
3      6        NA        10
4      7        NA        20
去那里最好的方法是什么?我应该做一些整形手术吗?如果我这样做,我必须先合并数据帧吗

这是我的解决方案,可能不是最好的。(在实际应用中,列表中会有两个以上的数据帧。)

#更改新变量名

名称1您可以尝试使用
merge

 Reduce(function(...) merge(..., by='custID', all=TRUE), res)
 #     custID top_pct.x top_pct.y
 #1      1        10        10
 #2      2        20        20
 #3      6        NA        10
 #4      7        NA        20
或者正如@collone beuvel所建议的,一种更具可读性的方法是使用
library(functional)


您可以尝试使用
merge

 Reduce(function(...) merge(..., by='custID', all=TRUE), res)
 #     custID top_pct.x top_pct.y
 #1      1        10        10
 #2      2        20        20
 #3      6        NA        10
 #4      7        NA        20
或者正如@collone beuvel所建议的,一种更具可读性的方法是使用
library(functional)


使用
functional
package:
Reduce(Curry(merge,by='custID',all=T),res)
使用
functional
package:
Reduce(Curry(merge,by='custID',all=T),res)可能更可读。
 Reduce(function(...) merge(..., by='custID', all=TRUE), res)
 #     custID top_pct.x top_pct.y
 #1      1        10        10
 #2      2        20        20
 #3      6        NA        10
 #4      7        NA        20
 library(functional)
 Reduce(Curry(merge, by='custID', all=T), res)