2016-04-01 31 views
1

嗨我試圖找到一個使用dplyr所有行中的變量的平均值。由於dplyr提供了一個名爲row_number()方便的功能,我想我可以用這樣的:如何使用R中的dplyr來計算leave one out平均值?

library(dplyr) 

iris %>% 
    tbl_df %>% 
    select(Sepal.Length) %>% 
    mutate(loo_avg=mean(Sepal.Length[-row_number()])) # leave one out average 

但這返回這樣的結果:

Source: local data frame [150 x 2] 

    Sepal.Length loo_avg 
      (dbl) (dbl) 
1   5.1  NaN 
2   4.9  NaN 
3   4.7  NaN 
4   4.6  NaN 
5   5.0  NaN 
6   5.4  NaN 
7   4.6  NaN 
8   5.0  NaN 
9   4.4  NaN 
10   4.9  NaN 
..   ...  ... 

你如何解決這個問題?

+1

也許這就是你要找的東西:http://stackoverflow.com/questions/35858876/calculate-group-mean-while-excluding-current-observation-using-dplyr/35859197#35859197 – mtoto

+0

@mtoto那非常整潔! 。但是......如果我想使用比平均值更復雜的函數呢?我正在查看是否有使用子集的方法.. – Alby

+1

請參閱鏈接問題中的akrun評論。 – mtoto

回答

2

我特別喜歡data.table方法:

library(data.table) 

DT <- as.data.table(iris) 

DT[ , loo_avg := DT[-.BY$left_out, mean(Sepal.Length)], 
    by = .(left_out = 1:nrow(DT)) 
    ][,.(Sepal.Length, loo_avg)] 
#  Sepal.Length loo_avg 
# 1:   5.1 5.848322 
# 2:   4.9 5.849664 
# 3:   4.7 5.851007 
# 4:   4.6 5.851678 
# 5:   5.0 5.848993 
# ---      
# 146:   6.7 5.837584 
# 147:   6.3 5.840268 
# 148:   6.5 5.838926 
# 149:   6.2 5.840940 
# 150:   5.9 5.842953 

注意,這種方法也使得它非常容易做你想做的,除了在jmean