使用data.table计算依赖于许多列的函数

时间:2015-01-26 19:53:27

标签: r 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列中的数字。&#39; a。 我无法看到如何使用SDcols做到这一点并最终做到:

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

这非常乏味。有没有更合理的方法呢?

由于

1 个答案:

答案 0 :(得分:9)

我真的建议通过vignettes linked hereIntroduction 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中的所有列与“a”进行比较来返回逻辑矩阵。然后使用rowSums对它们进行总结。

使用Reduce的另一种方式:

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