有许多帖子讨论在使用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)
Run Code Online (Sandbox Code Playgroud)
现在,假设我想计算第5,6,7和8列中'a'的数量.我看不到如何使用SDcols执行此操作并最终执行:
data.dt[,numberOfAs := (var5=='a')+(var6=='a')+(var7=='a')+(var7=='a')]
Run Code Online (Sandbox Code Playgroud)
这很乏味.有更合理的方法吗?
谢谢
我真的建议你看看这里链接的小插曲.数据引言中的第2e节简要介绍了.SD和.SDcols.
.SD只是一个包含当前组数据的data.table.并.SDcols告诉列.SD应该有.一种有用的方法是print用来查看内容.
# .SD contains cols 5:8
data.dt[, print(.SD), .SDcols=5:8]
Run Code Online (Sandbox Code Playgroud)
由于此处没有by,.SD包含data.dt对应于指定列的所有行.SDcols.
一旦你理解了这一点,任务就会减少你对基础R的了解.您可以通过多种方式实现此目的.
data.dt[, numberOfAs := rowSums(.SD == "a"), .SDcols=5:8]
Run Code Online (Sandbox Code Playgroud)
我们通过比较"a"中的所有列.SD来返回逻辑矩阵.然后用它来总结它们.rowSums
另一种使用方式Reduce:
data.dt[, numberOfAs := Reduce(`+`, lapply(.SD, function(x) x == "a")), .SDcols=5:8]
Run Code Online (Sandbox Code Playgroud)