【发布时间】:2021-05-03 18:18:26
【问题描述】:
所以我是 data.table 的新手,现在不明白我可以在使用 .SD 符号对所选列执行操作的同时通过引用进行修改?我有两个例子。
示例 1
> DT <- data.table("group1:1" = 1, "group1:2" = 1, "group2:1" = 1)
> DT
group1:1 group1:2 group2:1
1: 1 1 1
例如,假设我只选择名称中包含“group1:”的列。我知道将操作结果重新分配给同一个对象非常简单,如下所示:
cols1 <- names(DT)[grep("group1:", names(DT))]
DT <- DT[, .SD, .SDcols = cols1]
通过阅读关于引用语义的data.table 小插图,我的理解是上述内容不会通过引用进行修改,而使用:= 的类似操作会这样做。这是准确的吗?如果这是正确的,有没有更好的方法来执行这个通过引用修改的操作?在试图弄清楚这一点时,我陷入了如何组合 .SD 符号和 := 运算符的问题上。我试过了
DT[, c(cols1) := .SD, .SDcols = cols1]
DT[, c(cols1) := lapply(.SD,function(x)x), .SDcols = cols1]
两者都没有给出我想要的结果。
示例 2
假设我想执行一个不同的操作dcast,它使用.SD 作为输入。示例数据表:
> DT <- data.table(x = c(1,2,1,2), y = c("A","A","B","B"), z = 5:8)
> DT
x y z
1: 1 A 5
2: 2 A 6
3: 1 B 7
4: 2 B 8
再一次,我知道我可以像这样重新分配:
> DT <- dcast(DT, x ~ y, value.var = "z")
> DT
x A B
1: 1 5 7
2: 2 6 8
但不明白为什么以下方法不起作用(或者在某些情况下是否更可取):
> DT <- data.table(x = c(1,2,1,2), y = c("A","A","B","B"), z = 5:8)
> cols <- c("x", unique(DT$y))
> DT[, cols := dcast(.SD, x ~ y, value.var = "z")]
【问题讨论】:
标签: r reference data.table dcast