r - 在函数中按名称传递 data.table 列

标签 r data.table

我想将列名传递给函数并使用列索引和 setorder 函数:

require(data.table)
data(iris)

top3 = function(t, n) {
  setorder(t, n, order=-1)
  return ( t[1:3, .(Species, n)])
}

DT = data.table(iris)
top3(DT, Petal.Width)

但是,这会返回错误:

setorderv(x, cols, order, na.last) 中的错误: 有些列不在 data.table 中:n,1

我认为我误解了 R 中传递裸列名称的工作原理。我有什么选择?

最佳答案

你可以做到

top3 = function(DT, nm) eval(substitute( DT[order(-nm), .(Species, nm)][, head(.SD, 3L)] ))
top3(DT, Petal.Width)

     Species Petal.Width
1: virginica         2.5
2: virginica         2.5
3: virginica         2.5

我建议不要在函数内使用 (1) setorder,因为它有副作用; (2) 当您将来可能在少于三行的 data.table 上使用此索引时,使用 1:3 进行索引,会产生奇怪的效果; (3) 修复 3 而不是将其作为函数的参数; (4) 使用 n 作为名称...只是我个人偏好保留 n 作为计数。

关于r - 在函数中按名称传递 data.table 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36872256/

相关文章:

r - 加速大型数据帧中的 3 列 R 搜索

r - 将多个值传播到R中数据框中的唯一值

r - 使用 for 循环仅获取选定变量的相关性

r - 使用 ifelse 和 group by 改变 data.table 中的列

r - 按两个向量提供的范围过滤,无需连接操作

R:删除列中的重复元素,保留第一次出现并重新定位值

r - 在构建分数多项式函数时避免 eval(parse())

r - 在 R 中,如何将一行中的每个值转换为该行总和的比例?

r - 转换小时 :minute:second (HH:MM:SS) string to proper time class

根据前面的值按组替换值序列