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"]]
)
分组