2016-11-19 41 views
0

我想選擇id和由一定的條件採取ID的平均特定條件和測量平均這些ID的值的。我想衡量所有誰至少有1次特殊因素選擇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 

舉例來說,我想IDS誰曾b爲因素的平均值,ID 1和2有b作爲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,所以它從計算中排除,我們採取IDS的平均誰在他們的因素至少有一個時間B 。請告訴我,如果不清楚,我會舉更多的例子 – MFR

+0

是的,對於測量平均值,我用id 1和id 2取所有值的平均值,因爲id 3從來沒有b,我排除了編號3. – MFR

+0

這是正確的,但我有很多因素,我不能分別衡量它們的價值,我想自動做所有因素 – MFR

回答

2

轉換後的data.framedata.tablesetDT(mdf)),我們通過「因素」,由「ID」,在「係數」的ifany分組的unique元素循環有特定的元素,子集data.table(.SD),得到「值」和作爲2列「data.table」和rbindlist元件unique「因子」元素的mean

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(任何(因子== x))'例如,假設我想選擇沒有b的ID並取其平均值 – MFR

+1

@MFR在這種情況下,也許'if(all(factor!= x))' – akrun

2

通過基礎R的想法,

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