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 R
transform
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 R
transform
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想要重新排列行。