2013-05-17 23 views
0

我有一個由factor和numeric變量組成的大數據框(數值變量包含NA)。我想找出多個數值變量的觀察值數量,以表示因子變量的不同水平。而不是單獨處理每個數字變量,我試圖用點符號或cbind來使用聚合函數來表示我想要使用length()進行分組和計數的數字變量。然而,當我這樣做時,這個聚合給出了每個變量的相同數量的觀察值,我知道這是錯誤的。是否有關於聚合和長度的東西不適用於多個變量?長度()在使用點符號的聚合函數中不起作用

下面是一個簡單的例子,它說明了問題...... var1在所有組中都應該有n = 3,當我自己對待它時,它會執行此操作,但是使用點符號或cbind它只假定n VAR2。

df <- data.frame(group=c("a","b","c","a","b","c","a","b","c"), var1=1:9, var2=c(1,2,3,NA,5,6,7,8,9)) 
    aggregate(var1 ~ group, df, length) 
    aggregate(var2 ~ group, df, length) 
    aggregate(. ~ group, df, length) 
    aggregate(cbind(var1,var2) ~ group, df, length) 

回答

3

也許這可以幫助:

df <- data.frame(group=c("a","b","c","a","b","c","a","b","c"), 
       var1=1:9, var2=c(1,2,3,NA,5,6,7,8,9)) 

with(df, length(cbind(var1, var2))) 

> with(df, length(cbind(var1, var2))) 
[1] 18 

length()對待cbind(var1, var2)作爲基質,它僅僅是一個維度矢量,所以你會得到報告prod(nrow(mat), ncol(mat))長度,其中mat是生成的矩陣。

理想情況下,你會使用nrow()代替length(),但也許更廣泛應用的是NROW()功能,這將治療載體爲1列的矩陣評估功能的目的。 nrow()不會爲一個矢量輸入

> nrow(1:10) 
NULL 

例如工作請嘗試以下:

aggregate(cbind(var1,var2) ~ group, df, NROW) 
aggregate(var1 ~ group, df, NROW) 

> aggregate(cbind(var1,var2) ~ group, df, NROW) 
    group var1 var2 
1  a 2 2 
2  b 3 3 
3  c 3 3 
> aggregate(var1 ~ group, df, NROW) 
    group var1 
1  a 3 
2  b 3 
3  c 3 

和你有NA,你可能不希望刪除不完整的情況下,這將在默認情況下發生的。

aggregate(cbind(var1,var2) ~ group, df, NROW, na.action = na.pass) 

> aggregate(cbind(var1,var2) ~ group, df, NROW, na.action = na.pass) 
    group var1 var2 
1  a 3 3 
2  b 3 3 
3  c 3 3 

的問題是,在建立數據幀傳遞給aggregate.data.frame,通常的模型:這是上述和因此爲什麼行爲組a數爲2對於添加na.action = na.pass到呼叫看出幀生成過程發生,並且aggregate.formula默認將na.action參數設置爲na.omit - 這是使用公式接口進行建模函數的標準行爲。

如果你要計算每個變量非NA值的數量,那麼你需要一個完全不同的方法,可能使用is.na(),在

foo <- function(x) sum(!is.na(x)) 
aggregate(cbind(var1,var2) ~ group, df, foo, na.action = na.pass) 

> aggregate(cbind(var1,var2) ~ group, df, foo, na.action = na.pass) 
    group var1 var2 
1  a 3 2 
2  b 3 3 
3  c 3 3 

其中通過計算非NA價值的作品數量通過TRUEFALSE經由!的強制,然後將得到的TRUE轉換爲1FALSEs至0,然後sum()然後爲我們添加。

+0

嗨加文!感謝您的解釋。我不希望納入我的計數或我的任何其他功能(最小,最大,平均等)的NA。我看到'foo'有效,但不明白你爲什麼使用'sum'。這不應該加起來所有的非NAs? – CJO

+0

對不起,我剛剛在代碼下方看到了你的文字。好吧,我明白這是如何工作的。不過,我也希望使用cbind或點符號的聚合來將其他函數應用到我的分組中(例如min,max,mean,sd)。只需添加na.action = na.pass即可。有什麼建議?順便說一句...這是你在Mac上給你的課程中的克萊爾! – CJO

+0

@CJO嗨克萊爾!你列出的這些函數都有一個'na.rm'參數,它將在執行計算而不是返回'NA'的同時忽略任何'NA'。您通過'...'參數將其他參數傳遞給函數。因此'聚集(cbind(var1,var2)〜group,df,mean,na.action = na.pass,na.rm = TRUE)'會起作用。只需將'mean'切換出來,並替換您提到的其他功能即可。 –