【问题标题】:R sum data table column with multiple if conditionsR sum 具有多个if条件的数据表列
【发布时间】:2018-05-14 13:21:38
【问题描述】:

我在 R 中有以下数据表:

      n       s     b  y
1 a 1Q 1990 Rank1 10
2 a 2Q 1990 Rank1 43
3 b 1Q 1991 Rank2 42
4 b 3Q 2000 Rank3 66
5 a 4Q 1991 Rank1 55
6 c 1Q 2005 rank3 44

我想根据其余列的值总结 y 列。例如,在第 n 列中的值为“a”,在第 s 列中的值为“Rank1”。需要注意的是,例如,我想将第一个季度之后的每个季度的所有数字相加,而不是之前的其他数字。对于 1990 年第一季度,我想将 1990 年第一季度之后到 2005 年第一季度的所有其他季度的数字相加,对于 1990 年第二季度,我想将所有数字相加到 2005 年第一季度,而不是 1990 年第一季度。

所以最终的结果应该是这样的:

n       s     b   y
1 a 1Q 1990 Rank1 108
2 a 2Q 1990 Rank1  98
3 b 1Q 1991 Rank2  42
4 b 3Q 2000 Rank3  66
5 a 4Q 1991 Rank1  55
6 c 1Q 2005 rank3  44

我什至不知道如何开始构建它。

非常感谢您的每一点帮助。

谢谢

【问题讨论】:

标签: r


【解决方案1】:

这是data.table的解决方案:

library("data.table")
DT <- fread(
"n       s     b  y
a 1Q.1990 Rank1 10
a 2Q.1990 Rank1 43
b 1Q.1991 Rank2 42
b 3Q.2000 Rank3 66
a 4Q.1991 Rank1 55
c 1Q.2005 rank3 44")
DT[, ysum:=rev(cumsum(rev(y))), by=.(n, b)][]
# > DT[, ysum:=rev(cumsum(rev(y))), by=.(n, b)][]
#    n       s     b  y ysum
# 1: a 1Q.1990 Rank1 10  108
# 2: a 2Q.1990 Rank1 43   98
# 3: b 1Q.1991 Rank2 42   42
# 4: b 3Q.2000 Rank3 66   66
# 5: a 4Q.1991 Rank1 55   55
# 6: c 1Q.2005 rank3 44   44

使用基础R,您可以这样做:

DT$ysum2 <- ave(DT$y, DT$n, DT$b, FUN=function(x) rev(cumsum(rev(x))))

【讨论】:

  • 这解决了我的问题!毕竟这么简单的解决方案!非常感谢!
【解决方案2】:

您可以使用“sqldf”包对数据框执行类似 SQL 的查询。 在此之前,请将复合列“a”拆分为单个值,以便您更轻松地处理它们。

https://www.rdocumentation.org/packages/sqldf/versions/0.4-11

https://cran.r-project.org/web/packages/sqldf/sqldf.pdf

【讨论】:

  • 谢谢!尽管有很多数据具有相当多的不同组合,并且为每个组合设置不同的查询将是苛刻的。还有其他方法吗?
  • @Sammy 请阅读stackoverflow.com/help/how-to-answer 你写的更多是评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2021-10-24
相关资源
最近更新 更多