此问题是对this previous question。
的跟进我有一个id的矢量sampleIDs
。
我还有一个data.table,rec_data_table
,按出价键入并包含一列,
A_IDs.list
其中每个元素是aID的集合(向量)。
我想创建第二个data.table包含sampleIDs
和其中
对于每个aID
,都有一个对应的所有bID的向量
该ID出现在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
的预期结果,我可以提供la
超过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)
答案 0 :(得分:2)
在我对上一个问题的回答中加入tmp
到A_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
的方法更快。
答案 1 :(得分:0)
我认为这可以提供您想要的输出:
myfun <- function(ids) {
any(ids %in% sampleIDs)
}
rec_data_table[sapply(A_IDs.list, myfun),]
# bID counts names_list A_IDs.list
# 1: 301 21 C,E 3,NA
# 2: 303 5 H,E,G 8,NA,7
# 3: 304 10 H,D 8,4
# 4: 307 6 B,C 2,3
rec_data_table[sapply(A_IDs.list, myfun), list(bID, A_IDs.list)]
# bID A_IDs.list
# 1: 301 3,NA
# 2: 303 8,NA,7
# 3: 304 8,4
# 4: 307 2,3
您可以使用unlist
列上的A_IDs.list
获取长数据。表:
unique(na.omit(rec_data_table[sapply(A_IDs.list, myfun), list(bID, unlist(A_IDs.list))]))
# bID V2
# 1: 301 3
# 2: 304 8
# 3: 301 7
# 4: 303 8
# 5: 304 4
# 6: 307 2
我建议使用“长”数据而不是上面的嵌套列表构造,因为它通常会导致更简单的代码。
答案 2 :(得分:0)
bIDs <- lapply(sampleIDs, function(x){rec_data_table$bID[sapply(rec_data_table$A_IDs.list, function(y){x %in% y})]})
AB.dt <- data.table(aID=sampleIDs, bIDs=bIDs)
也许有更快的方法,但这个有效。 :)