【问题标题】:Looping over columns in data.table R循环遍历 data.table R 中的列
【发布时间】:2020-01-17 14:28:21
【问题描述】:

我正在尝试遍历 R 中 data.table 包中的列。当我对数据表进行子集化时,我在尝试让 for 循环准确输入列时遇到了麻烦。

我的任务目标是在满足“==1”的列条件时获取数据表每个子集的行数。

这是我的代码:


data <- data.table(va=c(1,0,1), vb=c(1,0,0), vc=c(1,1,1))


names <- c("va", "vc")

for (col in names) {
    print(nrow(data[col == 1,]))
    print(col)
}

这是我得到的输出

[1] 0
[1] "va"
[1] 0
[1] "vc"

我有什么遗漏或更好的方法吗?

【问题讨论】:

  • 您正在对行进行子集化。也许试试print(nrow(data[, col == 1]))
  • NULL [1] "va" NULL [1] "vc" 该代码的输出

标签: r datatable data.table


【解决方案1】:

你可以使用colSums,它比循环更简单更快。

dt <- data.table(va=c(1,0,1), vb=c(1,0,0), vc=c(1,1,1))
col.names <- c("va", "vc")
dt[, colSums(.SD==1), .SDcols = col.names]
# va vc 
# 2  3 

注意:我将您的对象名称更改为 dtcol.names,因为使用基函数作为名称不是一个好习惯。

如果您真的想要使用for 循环(我不推荐它,但出于教育目的...)您可以使用get 修复它以使用values 列而不是列 name 本身

for (col in col.names) {
  dt[get(col) == 1, print(.N)]
}

【讨论】:

  • 这就是我要找的东西,谢谢dww,我仍然需要弄清楚为什么我的循环功能不起作用
猜你喜欢
  • 2012-05-22
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多