2016-11-19 14 views
0

IDを選択して特定の条件でIDの平均を取ることを希望します。私は私が要因としてbを持っていたidの平均、ID 1および2のようにbを持っていたい、少なくとも1時間、特定の要因例えば特定の条件のIDを選択し、これらのIDの値の平均を測定します。R

mdf <- data.frame (id =c(1,2,3,2,1,2), 
factor= c("a","b","a","a","b" ,"a") , value = c(4,0,5,2,3,6)) 



    id factor value 
1 1  a  4 
2 2  b  0 
3 3  a  5 
4 2  a  2 
5 1  b  3 
6 2  a  6 

を持っていたすべてのIDの平均値を測定したいのですが私のコードでは、id 1とid 2の値を抽出し、それらの平均(4 + 0 + 2 + 3 + 6)/ 5 = 3を測定する必要があります。id 3にはbがないことに注意してください。計算から除外されます。 ので、私の理想的な出力は、変換後

factor avg 
a  3.33 
b  3 
+0

akrun、ID 3は、Bがなかった、我々は彼らの要因に少なくとも1件の時間Bを持っていたidの平均を取ります。 – MFR

+0

はい、平均値を測定するために、id 3にはbがなかったので、すべての値の平均値をid 1とid 2で取ったid 3. – MFR

+0

それは正しいですが、私は多くの要因があります。それぞれの値を別々に測定することはできません。すべての要因に対して自動的に行いたいです。 – MFR

答えて

2

になるdata.framedata.tablesetDT(mdf))に、我々は、「ID」、「因子」のifanyによってグループ化された「因子」のunique要素をループすることを有しますdata.table(.SD)をサブセットし、 'value'のmeanと 'factor'要素のuniqueを2列 'data.table'とrbindlist要素として取得します。それは計算から除外されるように、ベースRを経由して

library(data.table) 
setDT(mdf) 
rbindlist(lapply(unique(mdf$factor), function(x) { 
     x1 <- mdf[, if(any(factor==x)) .SD, id][, .(factor= x, avg=mean(value))]})) 
# factor  avg 
#1:  a 3.333333 
#2:  b 3.000000 
+0

ありがとう、@完璧な@akrun。因子を持たないIDの平均を求めたいのなら、たとえばif(any(factor == x))と書くことができます。たとえば、bを持たないIDを選択したいとしましょうそれらの平均をとる – MFR

+1

@MFRその場合、おそらく 'if(all(factor!= x))' – akrun

2

アイデアは、

fun1 <- function(df, f, include = TRUE){ 
    ind <- unique(df$id[df$factor == f]) 
    if (include == TRUE) { 
    return(mean(df$value[df$id %in% ind])) 
    } else { 
    return(mean(df$value[!df$id %in% ind])) 
    } 
} 

sapply(levels(mdf$factor), function(i) fun1(mdf, i)) 
#  a  b 
#3.333333 3.000000 

sapply(levels(mdf$factor), function(i) fun1(mdf, i, include = FALSE)) 
# a b 
#NaN 5 
関連する問題