gpt4 book ai didi

R如何按条件加入data.table?

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

经过一番研究,尤其是在这里,我发现了一种我认为非常有趣的方法,可以按条件连接两个 data.table :DT[WHERE, v := FROM[.SD, on=, x.v]] .

不幸的是,尽管尝试了很多次,我还是无法执行此操作。

从 DT1 和 DT2,我需要创建 DTres:仅对某些 DT1 行执行连接。

而DT3是我失败的尝试之一...

这有可能吗?如何?

非常感谢您的帮助。

library(data.table)

DT1 <- data.table(crit = rep(c('AA', 'BB', 'CC', 'DD'),each = 3),
num = rep(1:3, 4),
val = rnorm(12)^2)
DT1

DT2 <- data.table(BB = c(1,3),
cross = c(128, 183))
DT2

DTres <- data.table(crit = rep(c('AA', 'BB', 'CC', 'DD'),each = 3),
num = rep(1:3, 4),
val = rnorm(12)^2,
cross = c(rep(NA,3), 128, NA, 183, rep(NA, 6))
)
DTres

DT3 <- DT1[crit == 'BB', cross := DT2[DT1, on = .('BB' = num), x.cross]]

最佳答案

在第二个数据集中创建一列'crit',进行连接并将'cross'的值从'DT2'分配给'DT1'

DT1[DT2[,  c(.(crit = 'BB'), .SD)] , cross := cross, on = .(crit, num = BB)]

DT1

或者将第二个数据melt成'long'格式

DT1[ melt(DT2, id.var = 'cross', variable.name = 'crit'), 
cross := cross, on = .(crit, num = value)]



DT1
# crit num val cross
# 1: AA 1 4.720241e+00 NA
# 2: AA 2 2.261093e-01 NA
# 3: AA 3 5.040239e-01 NA
# 4: BB 1 3.729867e-01 128
# 5: BB 2 8.725384e-01 NA
# 6: BB 3 1.571597e+00 183
# 7: CC 1 8.494091e-02 NA
# 8: CC 2 1.965077e-01 NA
# 9: CC 3 1.221802e-06 NA
#10: DD 1 5.526632e-03 NA
#11: DD 2 3.475349e-01 NA
#12: DD 3 3.233841e-01 NA

或者基于 OP 尝试的另一种选择是

DT1[crit == 'BB' & num %in% DT2$BB, 
cross := .SD[DT2, on = .(num = BB)]$cross]

关于R如何按条件加入data.table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66538630/

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