【问题标题】:Merging data frames in a list [duplicate]合并列表中的数据框[重复]
【发布时间】:2015-05-01 23:26:31
【问题描述】:

这是早期post 的一个分支,它围绕简化我的功能和消除合并lapply 产生的数据帧的需要进行了讨论。尽管dplyrdata.table 等工具消除了合并的需要,但我仍然想知道在这种情况下如何合并。我已将基于此answer 生成列表的函数简化为我之前的问题。

#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))
    })

这给了我以下结果:

$A
  custID top_pct
1      1      10
2      2      20

$B
  custID top_pct
1      1      10
2      2      20
6      6      10
7      7      20

我希望结果如下所示:

  custID A_top_pct B_top_pct
1      1        10        10
2      2        20        20
3      6        NA        10
4      7        NA        20

到达那里的最佳方式是什么?我应该进行某种重塑吗?如果我这样做,我必须先合并数据框吗?

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

#Change the new variable name
names1 <- names(res)

for(i in 1:length(res)) {
    names(res[[i]])[2] <- paste0(names1[i], "_top_pct")
}

#Merge the results
res_m <- res[[1]]
for(i in 2:length(res)) {
    res_m <- merge(res_m, res[[i]], by = "custID", all = TRUE)
} 

【问题讨论】:

    标签: r merge


    【解决方案1】:

    你可以试试Reducemerge

     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
    

    或者正如@Colonel Beauvel 所建议的那样,一种更易读的方法是用来自library(functional)Curry 包装它

     library(functional)
     Reduce(Curry(merge, by='custID', all=T), res)
    

    【讨论】:

    • 使用functional 包可能更具可读性:Reduce(Curry(merge, by='custID', all=T), res)
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 2016-12-23
    • 2018-10-06
    • 2019-02-06
    • 1970-01-01
    • 2018-05-09
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多