gpt4 book ai didi

r - 在 data.table 中查找向量中的所有匹配项

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

这个问题是对 this previous question 的跟进.

我有一个 id 向量,sampleIDs .
我也有一个数据表,rec_data_table ,以出价为键并包含一列,A_IDs.list其中每个元素都是 aID 的集合(向量)。

我想创建第二个 data.table 包含 sampleIDs和哪里
每个aID , 存在所有 bID 的对应向量,其中
该 aID 出现在 A_IDs.list 中柱子。

例子:

> rec_data_table
bid counts names_list A_IDs.list
1: 301 21 C,E 3,NA
2: 302 21 E NA
3: 303 5 H,E,G 8,NA,7
4: 304 10 H,D 8,4
5: 305 3 E NA
6: 306 5 G 7
7: 307 6 B,C 2,3

> sampleIDs
[1] 3 4 8

AB.dt <- data.table(aID=sampleIDs, key="aID")

# unkown step
AB.dt[ , bIDs := ???? ]

# desired result:
> AB.dt
aid bIDs
1: 3 301,307
2: 4 304
3: 8 303,304

我在 AB.dt[] 中尝试了几行不同的行称呼。
我能得到的最接近的是
rec_data_table[sapply(A_IDs.list, function(lst) aID %in% lst), bID]

对于给定的 aID,这将为我提供所需的结果, 我可以 lapply
sampleIDs创建向量列表并构建所需的结果。

但是,我怀疑必须有一个更“适合 data.table”的方法来实现这一点。任何建议表示赞赏。
#--------------------------------------------------#
# SAMPLE DATA #

library(data.table)
set.seed(101)

rows <- size <- 7
varyingLengths <- c(sample(1:3, rows, TRUE))
A <- lapply(varyingLengths, function(n) sample(LETTERS[1:8], n))
counts <- round(abs(rnorm(size)*12))
rec_data_table <- data.table(bID=300+(1:size), counts=counts, names_list=A, key="bID")

A_ids.DT <- data.table(name=LETTERS[c(1:4,6:8,10:11)], id=c(1:4,6:8,10:11), key="name")
rec_data_table[, A_IDs.list := sapply(names_list, function(n) c(A_ids.DT[n, id]$id))]
sampleIDs <- c(3, 4, 8)

最佳答案

加入后tmpA_ids.DT在我对上一个问题的回答中,您可以通过查找 sampleIDs 来获得所需的输出。在 tmp :

# ... from previous answer
# tmp <- A_ids.DT[tmp]

AB.dt <- setkey(tmp, id)[J(sampleIDs)][, list(bIDs = list(bID)),
by = list(aid = id)]

# setkey(tmp, orig.order)
# previous answer continues ...

请注意您的 bID 的大写然而,这两个问题的列是不同的。当然,这是假设您没有执行示例数据中的倒数第二行。这应该比 %in% 快由于 data.table的奇迹,当有很多记录时基于的方法的二分查找。

关于r - 在 data.table 中查找向量中的所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402436/

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