示例数据
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
答案 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中创建新列。