R 排序后是累计和+;通过
以下是我的数据:R 排序后是累计和+;通过,r,R,以下是我的数据: class x1 x2 c 6 90 b 5 50 c 3 70 b 9 40 a 5 30 b 1 60 a 7 20 c 4 80 a 2 10 我首先想按class(增加或减少并不重要),然后按x1(减少)排序,因此我执行以下操作: df <- df[with(df, order(class, x1, decreasing = TRUE))] class
class x1 x2
c 6 90
b 5 50
c 3 70
b 9 40
a 5 30
b 1 60
a 7 20
c 4 80
a 2 10
我首先想按class
(增加或减少并不重要),然后按x1
(减少)排序,因此我执行以下操作:
df <- df[with(df, order(class, x1, decreasing = TRUE))]
class x1 x2
c 6 90
c 4 80
c 3 70
b 9 40
b 5 50
b 1 60
a 7 20
a 5 30
a 2 10
接下来,我这样做了:
df$cumsum <- unlist(by(df$x2, df$class, cumsum))
# (Also tried this, same result)
df$cumsum <- unlist(by(df[,x2], df[,class], cumsum))
你知道我该怎么解决这个问题吗?谢谢我们可以使用
数据。表
library(data.table)
setDT(df)[, x2:= cumsum(x2) , class]
df
# class x1 x2
#1: c 6 90
#2: c 4 170
#3: c 3 240
#4: b 9 40
#5: b 5 90
#6: b 1 150
#7: a 7 20
#8: a 5 50
#9: a 2 60
注意:在上面我使用了有序数据
如果我们还需要订购
setorder(setDT(df), -class, -x1)[, x2:=cumsum(x2), class]
我们可以使用
data.table
library(data.table)
setDT(df)[, x2:= cumsum(x2) , class]
df
# class x1 x2
#1: c 6 90
#2: c 4 170
#3: c 3 240
#4: b 9 40
#5: b 5 90
#6: b 1 150
#7: a 7 20
#8: a 5 50
#9: a 2 60
注意:在上面我使用了有序数据
如果我们还需要订购
setorder(setDT(df), -class, -x1)[, x2:=cumsum(x2), class]
dplyr
也可以在这里工作
library(dplyr)
df %>%
group_by(class) %>%
arrange(desc(x1)) %>%
mutate(cumsum=cumsum(x2))
## class x1 x2 cumsum
## (fctr) (int) (int) (int)
## 1 a 7 20 20
## 2 a 5 30 50
## 3 a 2 10 60
## 4 b 9 40 40
## 5 b 5 50 90
## 6 b 1 60 150
## 7 c 6 90 90
## 8 c 4 80 170
## 9 c 3 70 240
如本文()和其他地方所述,
groupby
与arrange
结合使用意味着数据将首先按分组变量排序 dprir
也可以在这里工作
library(dplyr)
df %>%
group_by(class) %>%
arrange(desc(x1)) %>%
mutate(cumsum=cumsum(x2))
## class x1 x2 cumsum
## (fctr) (int) (int) (int)
## 1 a 7 20 20
## 2 a 5 30 50
## 3 a 2 10 60
## 4 b 9 40 40
## 5 b 5 50 90
## 6 b 1 60 150
## 7 c 6 90 90
## 8 c 4 80 170
## 9 c 3 70 240
如本文()和其他地方所述,
groupby
与arrange
结合使用意味着数据将首先按分组变量排序 您可以在class
列上使用base Rtransform
和ave
到cumsum
transform(df[order(df$class, decreasing = T), ], cumsum = ave(x2, class, FUN=cumsum))
# class x1 x2 cumsum
#1 c 6 90 90
#3 c 3 70 160
#8 c 4 80 240
#2 b 5 50 50
#4 b 9 40 90
#6 b 1 60 150
#5 a 5 30 30
#7 a 7 20 50
#9 a 2 10 60
您可以在
class
列上使用base Rtransform
和ave
到cumsum
transform(df[order(df$class, decreasing = T), ], cumsum = ave(x2, class, FUN=cumsum))
# class x1 x2 cumsum
#1 c 6 90 90
#3 c 3 70 160
#8 c 4 80 240
#2 b 5 50 50
#4 b 9 40 90
#6 b 1 60 150
#5 a 5 30 30
#7 a 7 20 50
#9 a 2 10 60
或者
setDT(df)[order(-class,-x1),x2:=cumsum(x2),by=class]
也将保留df
的原始顺序。@Arun谢谢,我是这样想的,但后来我认为OP想要重新排列行。或者setDT(df)[order(-class,-x1),x2:=cumsum(x2),by=class]
也将保留df
的原始顺序。@Arun谢谢,我是这样想的,但后来我认为OP想要重新排列行。