Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 表引用语义:遍历列和行组的内部结构_R_Data.table_Pass By Reference - Fatal编程技术网

R 表引用语义:遍历列和行组的内部结构

R 表引用语义:遍历列和行组的内部结构,r,data.table,pass-by-reference,R,Data.table,Pass By Reference,这个问题类似于 但是讨论了一个稍微不同的设置,所以我决定将它们分开 当通过对每个列应用函数my_fun替换data.table中的所有列,并结合使用by参数对行进行分组时,在如下设置中大致会发生什么 library(data.table) dt <- data.table(a = 1L:10L, b = 11L:20L, c = rep(LETTERS[1:2], each = 5)) my_fun <- function(x) x + 1L dt[, c("a", "b") :

这个问题类似于

但是讨论了一个稍微不同的设置,所以我决定将它们分开

当通过对每个列应用函数
my_fun
替换data.table中的所有列,并结合使用
by
参数对行进行分组时,在如下设置中大致会发生什么

library(data.table)
dt <- data.table(a = 1L:10L, b = 11L:20L, c = rep(LETTERS[1:2], each = 5))
my_fun <- function(x) x + 1L

dt[, c("a", "b") := lapply(.SD, my_fun), by = "c", .SDcols = c("a", "b")]
还有,类似于

lapply(c("a", "b"), function(col) dt[, (col) := my_fun(dt[[col]]), by = "c"])
grouping <- split(
  seq_len(nrow(tbl)),
  tbl[, list(GroupIndex = rep(.GRP, .N)), by = group_by][["GroupIndex"]]
)
不起作用,因为嵌套的子集
dt[[col]]
未分区。是否有另一种方法可以实现我的目标,使用
data.table

我现在认为(1)最准确地描述了如何以分组方式更新列。我通过以下观察得出这个结论:如果使用
by
参数通过引用更新列,则新数据类型必须与旧数据类型匹配。当通过引用更新整个列时,情况并非如此

为了强制采用逐列方法,我想可以手动进行行组子集设置,并使用嵌套的双循环:一个迭代列,一个迭代行组。为了确定data.table使用的组顺序,我能想到的最好方法是

lapply(c("a", "b"), function(col) dt[, (col) := my_fun(dt[[col]]), by = "c"])
grouping <- split(
  seq_len(nrow(tbl)),
  tbl[, list(GroupIndex = rep(.GRP, .N)), by = group_by][["GroupIndex"]]
)
分组