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

时间:2016-12-14 14:31:53

标签: 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 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

对于每一行,我想计算一个值,该值是其他行中相同Petal.Width的{​​{1}}的总和。例如,对于第2行,具有相同物种组的唯一另一行是第3行,因此结果将为sum(1.5)。

预期产出

Species

我尝试了以下代码,但没有成功:

d$newcol <- c(0.2, 1.5, 1.3, 0, 0.2)
# > 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

2 个答案:

答案 0 :(得分:2)

Species分组后,您可以sum Petal.Width Petal.Width为所有Petal.Width加上该物种,然后减去一个裸Petal.Width减去行的d %>% group_by(Species) %>% mutate( newcol = sum(Petal.Width) - Petal.Width )

实现它会给出以下代码,它返回预期的输出:

{{1}}

答案 1 :(得分:1)

使用dplyr

可以实现与ave解决方案等效的基础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

ave是一种典型的分组工具,用于在执行组级计算时在data.frame中创建新列。