【问题标题】:Using data.table to calculate a function which depends on many columns使用 data.table 计算依赖于多列的函数
【发布时间】:2015-01-26 19:53:26
【问题描述】:

有很多帖子讨论了在使用 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 列中“a”的数量。 我看不到如何使用 SDcols 执行此操作并最终这样做:

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

这很乏味。有没有更明智的方法来做到这一点?

谢谢

【问题讨论】:

  • 看起来您的数据可能是错误的形状(宽与长)。你确定这是最好的结构吗?

标签: r data.table


【解决方案1】:

我真的建议通过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]

【讨论】:

    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多