【问题标题】:Conditional Summing Across data.frames in RR中跨data.frames的条件求和
【发布时间】:2015-04-20 15:34:25
【问题描述】:

我正在将我在 Excel 中所做的分析迁移到 R 中,因为我的数据集已达到 Excel 的极限。

在 Excel 中,我有一个执行 sumifs 函数的工作表(“状态”),对另一个工作表(“成员”)中的值求和,这些工作表在“状态”中具有相同的状态/周组合。

我想在 R 中执行此操作,其中“状态”和“成员”是 data.frames。因此,对于“状态”data.frame 中的所有行,我想对“成员”data.frame 中在“状态”中具有相同状态/周组合的所有行求和。

数据集

state=data.frame(state=c('MD','MD','MD','NY','NY','NY'), week = 1:3) 
member=data.frame(memID = 1:5, state = c('MD','MD','NY','NY','MD'),
              week = 1:3,
              value = c(24,43,34,54,33,35,33,11,42,23,14,12,42,4,23))

期望的输出

state = data.frame(state=c('MD','MD','MD','NY','NY','NY'), week = 1:3, 
              total = c(80,90,70,96,15,76))

谢谢!


编辑:

一开始我过于简化了我的示例 - sumifs 还考虑了多个不等式。所以在这个例子中,使用相同的数据,如果值在 20 到 40 之间,我将如何计算总和?

新的期望输出将是

state = data.frame(state=c('MD','MD','MD','NY','NY','NY'), week = 1:3, 
              total = c(80,33,58,0,0,34)    )
              state

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    试试

     aggregate(value~state+week, member, sum)
    

    或者

     library(data.table)#v1.9.5+
     setDT(member)[, list(total=sum(value)), list(state, week)]
    

    更新

    如果您需要获取 20 到 40 之间“值”的 sum

    setDT(member)[, sum(value[between(value,20,40)]) ,list(state, week)]
    

    【讨论】:

    • 这非常有用。非常感谢。
    • @SFuj 没问题。很高兴为您提供帮助
    • 但是,我在问这个问题时可能过于简单化了我的问题。如果对于同样的问题,我想要相同的总和,但在行周或之前的几周内,正确的方法是什么?
    • 对不起,如果我不清楚,我已经编辑了帖子。主要是,我的问题是如何做你解释的同样的事情,但是对于包括不平等在内的多种情况
    • 太棒了。再次感谢您。
    猜你喜欢
    • 2019-02-24
    • 2016-11-19
    • 2019-12-11
    • 2011-05-20
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2021-03-08
    相关资源
    最近更新 更多