说吧,我有以下几点

# dummy data
df <- data.table(metric_1 = c(1,1,3)
                 , metric_2 = c(1,2,2)
                 ); df

   metric_1 metric_2
1:        1        1
2:        1        2
3:        3        2

在对每个计算的(分组依据)列进行行计数之前,我想通过对每一列执行计算(为了说明,简化如下)来遍历这两列(实际数据帧还有许多其他列):

# metric columns
x <- c('metric_1', 'metric_2')

# list to capture results
y <- vector('list', length(x))

# summarise
for (i in seq_along(x))
{
  y[[i]] <- df[, .(rows = .N)
               , by = .(fifelse(get(x[[i]]) == 1, 0, get(x[[i]])))
               ]
}

上面的工作原理是给出一个汇总表格的列表:

> y
[[1]]
   fifelse rows
1:       0    2
2:       3    1

[[2]]
   fifelse rows
1:       0    1
2:       2    2

但是,是否可以在循环内将GROUP BY列命名?我试了一下,用了x[[i]]:

for (i in seq_along(x))
{
  y[[i]] <- df[, .(rows = .N)
               , by = .(x[[i]] = fifelse(get(x[[i]]) == 1, 0, get(x[[i]])))
               ]
}

但得到的错误是:

Error: unexpected '=' in:
"    df[, .(rows = .N)
       , by = .(x[[i]] ="

考虑到数据量,data.table%的解决方案将不胜感激.

推荐答案

我们可以用setNames(list(..), x[[i]])代替你的.(..).

lapply(seq_along(x), function(i) {
  df[, .(rows = .N) ,
     by = setNames(list(fifelse(get(x[[i]]) == 1, 0, get(x[[i]]))), x[[i]]) ]
})
# [[1]]
#    metric_1  rows
#       <num> <int>
# 1:        0     2
# 2:        3     1
# [[2]]
#    metric_2  rows
#       <num> <int>
# 1:        0     1
# 2:        2     2

(仅供参考,我们不能在setNames内部使用.( ... ),它将错误地使用could not find function ".",这可能是因为NSE在data.table内部的解析魔力.这不是问题,因为.(...)对于list(...)来说真的只是一个方便的速记.)

通常,索引为[/[[的变量"永远"不能处理简单的=参数赋值的LHS.对于这一点,setNames是首选的方式.

R相关问答推荐

使用Shiny组合和显示复制和粘贴的数据

使用gggplot 2在R中重新调整面板和y轴文本大小

使用预定值列表将模拟数量(n)替换为rnorm()

获取列中值更改的行号

为什么在ggplot2中添加geom_text这么慢?

我不能在docker中加载sf

如何在R中合并两个基准点?

如何使用列表中多个列表中的第一条记录创建数据框

2个Rscript.exe可执行文件有什么区别?

为什么在BASE R中绘制线条时会看到线上的点?

从R中发出的咕噜声中的BUG?

在R中的数据框上使用Apply()函数时,如何保留非数字列?

创建在文本字符串中发现两个不同关键字的实例的数据框

错误包arrowR:READ_PARQUET/OPEN_DATASET&QOT;无法反序列化SARIFT:TProtocolException:超出大小限制&Quot;

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

在同一单元格中创建包含整数和百分比的交叉表

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容

如何使用list_rind在列表中保留已命名但不包含第0行的记录?

在R中,有没有什么方法可以根据一列中的多个值来过滤行?