2014-10-30 52 views
0

我試圖基於data.table中的單個列對各列進行總結(取平均值)。data.table按列列出時給出NA

這裏是我的數據的玩具例子,我使用的代碼,顯示我有問題:

library(data.table) 
a<- data.table(
    a=c(1213.1,NA,113.41,133.4,121.1,45.34), 
    b=c(14.131,NA,1.122,113.11,45.123,344.3), 
    c=c(101.2,NA,232.1,194.3,12.12,7645.3), 
    d=c(11.32,NA,32.121,94.3213,1223.1,34.1), 
    e=c(1311.32,NA,12.781,13.2,2.1,623.2), 
    f=c("A", "B", "B", "A", "B", "X")) 
a 
setkey(a,f) # column "f" is what I want to summarize columns by 

a[, lapply(.SD, mean), by=f, .SDcols=c(1:4)] # I just want to summarize first 4 columns 

最後一行的輸出:

> a[, lapply(.SD, mean), by=f, .SDcols=c(1:4)] 
f a b c d 
1: A 673.25 63.6205 147.75 52.82065 
2: B NA NA NA NA 
3: X 45.34 344.3000 7645.30 34.10000 

爲什麼爲B項NA?在計算平均值時不應忽略NA?我想我發現了一個類似的問題here,但也許這是不同的和/或我已經弄亂了語法。

如果這在data.table不可能,我接受其他建議。

+1

要忽略'NA's,你所需要的參數'na.rm = TRUE'。試試'[,lapply(.SD,mean,na.rm = TRUE),by = f,.SDcols = c(1:4)]' – ialm 2014-10-30 20:55:20

+0

啊。很簡單。你能寫出來嗎?我會給你點 – Prophet60091 2014-10-30 20:57:28

回答

2

在R中,mean()函數的默認行爲是在缺少值時輸出NA。在平均值計算中忽略NA s,需要設置參數na.rm=TRUElapply發生在其他參數它傳遞的功能,所以對於你的問題,你可以嘗試

a[, lapply(.SD, mean, na.rm=TRUE), by=f, .SDcols=c(1:4)]

+0

對不起,但爲什麼這不是'data.table'問題(我把你的標籤編輯回滾到Q)? :-O – Arun 2014-11-01 11:21:13

+0

因爲在data.table中發生這種行爲僅僅是巧合;即使沒有'library(data.table)',包含'NA'的列的平均值仍然是'NA'。 – Hugh 2014-11-01 12:31:31

+0

@Hugh,它有助於(未來)有相同問題的用戶用data.table標籤快速識別這個答案。問題的標題是「data.table給出...」。對於那些不瞭解搜索整個R標籤的人來說很難。 – Arun 2014-11-02 12:51:36