2015-01-26 26 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] 
相关问题