gpt4 book ai didi

r - 一次性加入和添加列

转载 作者:行者123 更新时间:2023-12-05 01:02:06 24 4
gpt4 key购买 nike

背景

我对 data.table 还很陌生图书馆,目前正在学习有效地使用它。我在这里有两个表,我想先聚合第二个,然后将它与第一个合并并修改连接表中的列。理想情况下(据我所知)一口气。

包版本

sessionInfo()
# R version 3.1.0 (2014-04-10)
# Platform: i386-w64-mingw32/i386 (32-bit)

# attached base packages:
# [1] stats graphics grDevices utils datasets methods base

# other attached packages:
# [1] data.table_1.9.4

# loaded via a namespace (and not attached):
# [1] chron_2.3-45 plyr_1.8.1 Rcpp_0.11.2 reshape2_1.4 stringr_0.6.2
# [6] tools_3.1.0

代码

我尝试过的可以在这个最小的例子中看到:
library(data.table)
set.seed(1)
DT1 <- data.table(id = LETTERS[1:4], x = rnorm(4), key = "id")
DT2 <- data.table(id = rep(LETTERS[1:4], each = 3), y = 1:12, z = rep(1, 12), key = "id")
DT1[DT2[, lapply(.SD, mean), by = "id"]] # simple join works fine
# id x y z
# 1: A -0.6264538 2 1
# 2: B 0.1836433 5 1
# 3: C -0.8356286 8 1
# 4: D 1.5952808 11 1

# however, adding a 'j' argument does not work
DT1[DT2[, lapply(.SD, mean), by = "id"], x := -x] # (1)

# in fact the above statement changes the 'x' column in 'DT1':
DT1
# id x
# 1: A 0.6264538
# 2: B -0.1836433
# 3: C 0.8356286
# 4: D -1.5952808

我想这与 data.table 的智能方式有关。处理数据(除非需要,否则不会复制,因此通过引用调用)。因此,以下代码有效:
DT3 <- copy(DT1[DT2[, lapply(.SD, mean), by = "id"]])[, x := -x]
(DT4 <- DT1[DT2[, lapply(.SD, mean), by = "id"]][, x := -x]) # (2)
# id x y z
# 1: A -0.6264538 2 1
# 2: B 0.1836433 5 1
# 3: C -0.8356286 8 1
# 4: D 1.5952808 11 1
identical(DT3, DT4)
# [1] TRUE

问题
  • 这样做的“最佳”方式是什么?在使用的时间和内存方面“最好”?
  • 这样做的概念方式是什么?所以换句话说,Matt Dowle(包维护者)会使用什么命令系列?
  • 为什么(1) (2) 时不工作按预期工作?
  • 最佳答案

    您当前实现的问题 (1)

    DT1[DT2[, lapply(.SD, mean), by = "id"], x := -x] # (1)

    是你正在修改 DT1引用 x:=-x , 加入 DT2[,...]实际上并没有分配。

    你想要的是 (4)
     DT3 <- DT1[DT2[, lapply(.SD, mean), by = "id"]][, x := -x]

    在这里,额外调用 [在连接的数据集上表示您正在分配 x:=-x在新创建的 data.table 中。

    除非您确实需要,否则不需要显式副本。

    关于r - 一次性加入和添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108145/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com