2016-04-01 10 views
1

こんにちは、私はdplyrを使用しているすべての行の変数の平均を残してみようとしています。 dplyrが提供する便利な機能がrow_number()と呼ばれるので、私はこのようにそれを使用すると考えていた:Rでdplyrを使用して平均を1つ残して計算するにはどうすればよいですか?

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

I特にdata.table方法のように:このアプローチはまた、それは信じられないほど簡単にあなたがjmean以外にやりたいことをできるようになり

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 

注意。

関連する問題