Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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
R中带apply函数的条件累积和_R_Apply_Cumsum - Fatal编程技术网

R中带apply函数的条件累积和

R中带apply函数的条件累积和,r,apply,cumsum,R,Apply,Cumsum,可能这个问题已经在SO中得到了解决和回答,但无法找到答案。我在一个非常大的数据帧上计算条件的累积和。看看下面的例子 Data=data.frame("Catg"=c("A","A","A","A","A","B","B","B","C","C","C","D","D","D","D","D","D","D","D","E","E","F"),"Val"=c(67,42,12,32,28,1,11,9,38,61,75,99,22,44,89,99,51,34,82,99,74,42)) Res=

可能这个问题已经在SO中得到了解决和回答,但无法找到答案。我在一个非常大的数据帧上计算条件的累积和。看看下面的例子

Data=data.frame("Catg"=c("A","A","A","A","A","B","B","B","C","C","C","D","D","D","D","D","D","D","D","E","E","F"),"Val"=c(67,42,12,32,28,1,11,9,38,61,75,99,22,44,89,99,51,34,82,99,74,42))
Res=NULL
UniqCatg=unique(Data$Catg)
for(i in 1:length(UniqCatg))
    Res=c(Res, cumsum(Data[Data$Catg==UniqCatg[i],"Val"]))
Data$Res=Res
Data

有没有一种不使用for循环的聪明方法?(如应用函数)

您可以使用
ave

Data$Res <- ave(Data$Val, Data$Catg, FUN=cumsum)
#   Catg Val Res
#1     A  67  67
#2     A  42 109
#3     A  12 121
#4     A  32 153
#5     A  28 181
#6     B   1   1
#7     B  11  12
#8     B   9  21
#9     C  38  38
#10    C  61  99
#11    C  75 174
#12    D  99  99
#13    D  22 121
#14    D  44 165
#15    D  89 254
#16    D  99 353
#17    D  51 404
#18    D  34 438
#19    D  82 520
#20    E  99  99
#21    E  74 173
#22    F  42  42

Data$Res您可以使用
ave

Data$Res <- ave(Data$Val, Data$Catg, FUN=cumsum)
#   Catg Val Res
#1     A  67  67
#2     A  42 109
#3     A  12 121
#4     A  32 153
#5     A  28 181
#6     B   1   1
#7     B  11  12
#8     B   9  21
#9     C  38  38
#10    C  61  99
#11    C  75 174
#12    D  99  99
#13    D  22 121
#14    D  44 165
#15    D  89 254
#16    D  99 353
#17    D  51 404
#18    D  34 438
#19    D  82 520
#20    E  99  99
#21    E  74 173
#22    F  42  42

Data$Res或使用
plyr::ddply

require( plyr )
ddply( Data , "Catg" , transform , Res = cumsum(Val) )
#   Catg Val Res
#1     A  67  67
#2     A  42 109
#3     A  12 121
#4     A  32 153
#5     A  28 181
#6     B   1   1
#7     B  11  12
#8     B   9  21
#9     C  38  38
#10    C  61  99
#11    C  75 174
#12    D  99  99
#13    D  22 121
#14    D  44 165
#15    D  89 254
#16    D  99 353
#17    D  51 404
#18    D  34 438
#19    D  82 520
#20    E  99  99
#21    E  74 173
#22    F  42  42

或使用
plyr::ddply

require( plyr )
ddply( Data , "Catg" , transform , Res = cumsum(Val) )
#   Catg Val Res
#1     A  67  67
#2     A  42 109
#3     A  12 121
#4     A  32 153
#5     A  28 181
#6     B   1   1
#7     B  11  12
#8     B   9  21
#9     C  38  38
#10    C  61  99
#11    C  75 174
#12    D  99  99
#13    D  22 121
#14    D  44 165
#15    D  89 254
#16    D  99 353
#17    D  51 404
#18    D  34 438
#19    D  82 520
#20    E  99  99
#21    E  74 173
#22    F  42  42

谢谢你,伙计!它帮了我+1-我想发布这个,但是如果你不键入
FUN
你会得到一个错误,我一辈子都无法找出为什么这个对我不起作用。。。直到你把它贴出来。由于对变量进行分组的
,我想谢谢你,伙计!它帮了我+1-我想发布这个,但是如果你不键入
FUN
你会得到一个错误,我一辈子都无法找出为什么这个对我不起作用。。。直到你把它贴出来。由于我猜分组变量的
,我注意到您从未接受过答案。您可能希望阅读网站的和部分,以帮助您充分利用SO。如果一个答案确实解决了你的问题,你可能想要考虑一下投票和/或标记它被接受来显示问题已经被答案,通过在适当的答案旁边划上绿色的小复选标记。你没有义务这么做,但这有助于保持网站上没有未回答的问题,并奖励那些花时间解决你问题的人。嗨,我注意到你从未接受过答案。您可能希望阅读网站的和部分,以帮助您充分利用SO。如果一个答案确实解决了你的问题,你可能想要考虑一下投票和/或标记它被接受来显示问题已经被答案,通过在适当的答案旁边划上绿色的小复选标记。你没有义务这么做,但这有助于保持网站上没有未回答的问题,并奖励那些花时间解决你问题的人。