如何使用dplyr或其他任何方法获取同一组中其他行的列的总和?

如何使用dplyr或其他任何方法获取同一组中其他行的列的总和?,r,dplyr,R,Dplyr,示例数据 set.seed(1) d <- iris[sample.int(nrow(iris), 5), ] # Sepal.Length Sepal.Width Petal.Length Petal.Width Species # 40 5.1 3.4 1.5 0.2 setosa # 56 5.7 2.8 4.5 1.3 v

示例数据

set.seed(1)
d <- iris[sample.int(nrow(iris), 5), ]
#     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 40           5.1         3.4          1.5         0.2     setosa
# 56           5.7         2.8          4.5         1.3 versicolor
# 85           5.4         3.0          4.5         1.5 versicolor
# 134          6.3         2.8          5.1         1.5  virginica
# 30           4.7         3.2          1.6         0.2     setosa
我尝试了以下代码,但无效:

library(dplyr)
d %>% group_by(Species) %>%
    mutate(
        newcol = sum(Petal.Width[1:n() != row_number()])
    )

一旦你按
物种进行分组
你就可以取
花瓣宽度
,它将该物种的所有
花瓣宽度
相加,然后只减去一个光秃秃的
花瓣宽度
,减去行的
花瓣宽度

实现这一点会产生以下代码,返回预期的输出:

d %>% group_by(Species) %>%
  mutate(
    newcol = sum(Petal.Width) - Petal.Width
  )

使用
ave
可以获得与
dplyr
解决方案等效的基本R:

d$newcol <- ave(d$Petal.Width, d$Species, FUN=function(x) sum(x) - x)

d
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species newcol
40           5.1         3.4          1.5         0.2     setosa    0.2
56           5.7         2.8          4.5         1.3 versicolor    1.5
85           5.4         3.0          4.5         1.5 versicolor    1.3
134          6.3         2.8          5.1         1.5  virginica    0.0
30           4.7         3.2          1.6         0.2     setosa    0.2
d$newcol
d$newcol <- ave(d$Petal.Width, d$Species, FUN=function(x) sum(x) - x)

d
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species newcol
40           5.1         3.4          1.5         0.2     setosa    0.2
56           5.7         2.8          4.5         1.3 versicolor    1.5
85           5.4         3.0          4.5         1.5 versicolor    1.3
134          6.3         2.8          5.1         1.5  virginica    0.0
30           4.7         3.2          1.6         0.2     setosa    0.2