R sum数据表列具有多个if条件

时间:2018-05-14 13:21:38

标签: r

我在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

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

非常感谢每一点帮助。

由于

2 个答案:

答案 0 :(得分:0)

以下是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))))

答案 1 :(得分:-1)

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

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

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