gpt4 book ai didi

r - 使用 data.table 包通过引用进行条件二进制连接和更新

转载 作者:行者123 更新时间:2023-12-04 16:06:43 25 4
gpt4 key购买 nike

所以这是我现实生活中的问题,我觉得可以轻松解决,但我在这里遗漏了一些明显的问题。我有两个名为 TKDFT 的大数据集

library(data.table)
set.seed(123)
(TK <- data.table(venue_id = rep(1:3, each = 2),
DFT_id = rep(1:3, 2),
New_id = sample(1e4, 6),
key = "DFT_id"))

# venue_id DFT_id New_id
# 1: 1 1 2876
# 2: 1 2 7883
# 3: 2 3 4089
# 4: 2 1 8828
# 5: 3 2 9401
# 6: 3 3 456

(DFT <- data.table(venue_id = rep(1:2, each = 2),
DFT_id = 1:4,
New_id = sample(4),
key = "DFT_id"))

# venue_id DFT_id New_id
# 1: 1 1 3
# 2: 1 2 4
# 3: 2 3 2
# 4: 2 4 1

我想在 TK 时在 DFT_id 列上执行 二进制左连接 venue_id %in% 1:2 ,同时通过引用 更新 New_id 。换句话说,想要的结果是
TK
# venue_id DFT_id New_id
# 1: 1 1 3
# 2: 2 1 3
# 3: 1 2 4
# 4: 3 2 9401
# 5: 2 3 2
# 6: 3 3 456

我想结合这两个条件,但它没有用(仍然不知道为什么)
TK[venue_id %in% 1:2 & DFT, New_id := i.New_id][]
# Error in `[.data.table`(TK, DFT & venue_id %in% 1:2, `:=`(New_id, i.New_id)) :
# i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14).
# Please let datatable-help know if you'd like this, or add your comments to FR #1611.

我的下一个想法是使用链接,通过正确连接但在一些临时表上而不实际影响 TK 来部分实现目标
TK[venue_id %in% 1:2][DFT, New_id := i.New_id][]
TK
# venue_id DFT_id New_id
# 1: 1 1 2876
# 2: 2 1 8828
# 3: 1 2 7883
# 4: 3 2 9401
# 5: 2 3 4089
# 6: 3 3 456

所以说清楚,我很清楚我可以将 TK 拆分为两个表,执行连接,然后再次执行 rbind,但我正在执行许多不同的条件连接,并且我也在寻找速度和内存效率解决方案。

这也意味着我不是在寻找 dplyr 解决方案,因为我试图同时使用二进制连接和通过引用更新的功能,这些功能仅存在于 data.table 包 IIRC 中。

有关其他信息,请参阅这些小插图:
  • Update by reference
  • Binary joins
  • 最佳答案

    复制 Arun 的更新答案 here

    TK[venue_id %in% 1:2, New_id := DFT[.SD, New_id]][]
    # venue_id DFT_id New_id
    # 1: 1 1 3
    # 2: 2 1 3
    # 3: 1 2 4
    # 4: 3 2 9401
    # 5: 2 3 2
    # 6: 3 3 456

    他的回答详细说明了正在发生的事情。

    关于r - 使用 data.table 包通过引用进行条件二进制连接和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38910869/

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