Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个if条件的R sum数据表列_R - Fatal编程技术网

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

具有多个if条件的R sum数据表列,r,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”。需要注意的是,我想将每个季度的所有数字相加,然后是第一个季度,而不是之前的其他季度。对于

我在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年第1季度,我想将1990年第1季度之后到2005年第1季度的所有其他数字相加,对于1990年第2季度,我想将所有数字相加到2005年第1季度,但不是1990年第1季度

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

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
我甚至不知道如何开始建造这个

非常感谢您的每一点帮助


谢谢

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


这是一个包含
数据的解决方案。表

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

谢谢虽然有很多数据有很多不同的组合,但为每个组合设置不同的查询将是非常困难的。还有别的方法吗?@Sammy请看你写的更多的是评论。这解决了我的问题!毕竟这是一个简单的解决方案!非常感谢你!
DT$ysum2 <- ave(DT$y, DT$n, DT$b, FUN=function(x) rev(cumsum(rev(x))))