2016-12-14 39 views
1

示例數據如何使用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 

對於每一行,我要計算的值,這是相同的SpeciesPetal.Width其他行的總和。例如,對於第2行,具有相同物種組的唯一其他行是第3行,因此結果將是sum(1.5)。

預期輸出

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 

我嘗試下面的代碼,它沒有工作:

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

回答

2

一旦通過Species分組可以採取sumPetal.Width這一切都增加了所有Petal.Width爲該物種,然後減去只是Petal.Width減去該行的Petal.Width

實現這給出了以下代碼返回預期的輸出:

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

非常感謝! – mt1022

1

甲基礎R相當於dplyr溶液可以與ave實現:

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中創建新列。

相關問題