2015-01-26 50 views
4

有許多帖子討論了在使用data.table時在多列上應用函數的問題。不過,我需要計算一個依賴於許多列的函數。舉個例子:使用data.table來計算取決於多列的函數

# Create a data table with 26 columns. Variable names are var1, ..., var 26 
data.mat = matrix(sample(letters, 26*26, replace=TRUE),ncol=26) 
colnames(data.mat) = paste("var",1:26,sep="") 
data.dt <- data.table(data.mat) 

現在,說我想算的「一在列5,6,7和8 數量也看不出如何與SDcols做到這一點,最終做:

data.dt[,numberOfAs := (var5=='a')+(var6=='a')+(var7=='a')+(var7=='a')] 

這是非常乏味的。有沒有更合理的方法來做到這一點?

感謝

+0

好像你的數據可能會在錯誤的形狀(寬VS長)。你確定這是最好的結構嗎? – MrFlick 2015-01-26 19:55:27

回答

9

我真的建議通過vignettes linked here去。 Introduction to data.table vignette的第2e部分解釋了.SD.SDcols

.SD只是一個包含當前組數據的data.table。並且.SDcols告訴.SD應該有。一個有用的方法是使用print來查看內容。

# .SD contains cols 5:8 
data.dt[, print(.SD), .SDcols=5:8] 

由於這裏沒有by.SD包含data.dt所有行,對應於.SDcols指定的列。


一旦你明白了這一點,任務就會減少到你對基本R的認識。您可以通過多種方式完成此操作。

data.dt[, numberOfAs := rowSums(.SD == "a"), .SDcols=5:8] 

我們通過所有列在.SD比較「一」返回一個邏輯矩陣。然後用rowSums來總結它們。

使用Reduce另一種方式:

data.dt[, numberOfAs := Reduce(`+`, lapply(.SD, function(x) x == "a")), .SDcols=5:8]