【问题标题】:merge list of dataframes by and sum different columns合并数据框列表并对不同的列求和
【发布时间】:2015-03-06 21:15:39
【问题描述】:

我有一个数据框列表

> df.t
[[1]]
column_A start_B stop_C column_D column_E
1        0        23       2        3 
1        23       200      1        0
2        0        55       0        1
[[2]]
column_A start_B stop_C column_D column_E
1        0        200      1        0
2        0        20       2        0
2        20       55       0        1
[[3]]
column_A start_B stop_C column_D column_E
1        0        200      0        0
2        0        55       4        2

我想基于column_A进行拆分,并通过column_A、start_B和stop_C合并column_D和column_E。对于每个唯一的 column_A 元素,我想仅使用唯一的 start_B 和 stop_C 元素来查找所有可能的唯一范围组合。例如,在 column_A = 1 的情况下,start_B 和 stop_C 之间唯一的最低到最高范围是 0 - 200,但是 df.t[[1]] 已经从 0 - 23 到 23-200 打破了这个范围。合并后导致这个预期的输出

预期输出:

> df.merge

column_A start_B stop_C column_D column_E
1        0        23       3        3
1        23       200      2        0   
2        0        20       6        3
2        20       55       4        4

我知道为了拆分和合并我可以做的两个数据框:

lst1 <- split(df.t[[1]], df.t[[1]]$column_A)
lst2 <- split(df.t[[2]], df.t[[2]]$column_A

require(survival)

df <- do.call(rbind, mapply(FUN = function(x, y) {

    x$event <- y$event <- 0
    lst1.spl <- survSplit(x, cut=y$stop_C, start='column_A', end='start_B', event='event')
    lst2.spl <- survSplit(y, cut=x$stop_C, start='column_A', end='start_B', event='event')
    mrg <- merge(lst1.spl, lst2.spl, 
            by=c('column_A', 'start_B', 'stop_C'))
    mrg[c('column_A', 'start_B', 'stop_C', 'column_D', 'column_E')]
    },
lst1, lst2, SIMPLIFY=FALSE))

但是,要在数据帧列表上完成此操作,并对 column_D 和 column_E 求和,我认为我应该使用 reduce(),但是我不确定它是否可行或最好的方法!

df.merge = Reduce(function(...) merge(..., by=c('column_A', 'start_B', 'stop_C')), df.t)

这仅按前三列合并,不求和 column_D 和 column_E。我知道我应该使用 ddply,但是我不确定如何正确使用它与 reduce。

谢谢!

【问题讨论】:

  • 这里df.merge 我猜是你在Reduce( 之后得到的那个,还是预期的输出?
  • 也许没有 join 和 dplyr df &lt;- Reduce(rbind, df.t) %&gt;% group_by(column_A, column_B, column_C) %&gt;% summarise_each(funs(sum), column_D, column_E)
  • @ckluss 您的代码给出的结果与预期略有不同
  • @user3324491 根据您的输入df.t,您确定预期结果正确吗?目前尚不清楚您是如何在column_B 中获得23
  • 我想我仍然不明白你是如何得到你列出的输出的。几个问题:(1)“基于column_A拆分”是什么意思?你是说R的split函数吗?但这不会改变合并结果。 (2) 举个例子,你能解释一下你是如何在column_D 的第 4 行得到一个 4 的吗? (3) 为什么您的预期输出中缺少三个合并列中的某些值组合?例如,1、0、200 发生了什么?

标签: r merge dataframe plyr reduce


【解决方案1】:

您的预期输出似乎与您对您正在尝试做的事情的描述不一致。下面的一些代码将为您提供三个数据帧中 column_A、column_B 和 column_C 的每个组合的一些 column_D 和 column_E 的总和。如果我误解了你的目标,请告诉我,我会更新。

方法:将三个数据框合并为一个数据框,然后将数据按三个分组列拆分,然后对每组求和。

library(dplyr) 

# Combine all three data frames into a single data frame
alldfs = bind_rows(df.t)

# Sum column_D and column_E for each combination of the grouping columns
alldfs %>% group_by(column_A, column_B, column_C) %>%
  summarise(sum_column_D = sum(column_D),
            sum_column_E = sum(column_E))

  column_A column_B column_C sum_column_D sum_column_E
1        1        0       23            2            3
2        1        0      200            1            0
3        1       90      200            1            0
4        2        0       20            2            0
5        2        0       55            4            3
6        2       20       55            0            1

【讨论】:

  • 是的,我忘了补充说,我想先在 column_A 上拆分后才合并。我会更新这个问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多