gpt4 book ai didi

r - 匹配第二个表中的数据时,在 `data.table` 中创建一列向量的最有效方法是什么?

转载 作者:行者123 更新时间:2023-12-01 10:57:27 25 4
gpt4 key购买 nike

data.table 中创建一列向量的最有效方法是什么?
我们需要匹配来自第二个 data.table 的元素.

例如,给定下面的两个 data.tables

   > A_ids.DT        > rec_data_table
name id bid counts names_list
1: A 1 1: 301 21 C,E
2: B 2 2: 302 21 E
3: C 3 3: 303 5 H,E,G
4: D 4 4: 304 10 H,D
5: F 6 5: 305 3 E
6: G 7 6: 306 5 G
7: H 8 7: 307 6 B,C
8: J 10
9: K 11

我想在 rec_data_table 中创建一个新列其中每个元素都是来自 A_ids.DT 的 id 列表如 rec_data_table[,names_list] 中所述

重要提示: names_list 的每个条目中表示的顺序必须反射(reflect)在新列中。即:对于行 3: ( H, E, G ) 我们应该得到 c(8, NA, 7)
以下行,使用 sapply有效,但我质疑它的效率。
是否有更好(即更快、更优雅)的替代方案? (注意实际数据是几十万行)
rec_data_table[, A_IDs.list := sapply(names_list, function(n) c(A_ids.DT[n, id]$id))]

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
#--------------------------------------------------#
# 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")

最佳答案

也许解压缩列表,然后加入整个表格,然后重新打包?

tmp <- setkey(rec_data_table[, list(names = names_list[[1]],
orig.order = seq_along(names_list[[1]])),
by = list(bid, counts)], names)
tmp <- A_ids.DT[tmp]
setkey(tmp, orig.order)
tmp <- tmp[, list(names_list = list(name), A_IDs.list = list(id)),
by = list(bid, counts)]

# Rearrange to sample output order
setkey(tmp, bid)
setcolorder(tmp, c("bid", "counts", "names_list", "A_IDs.list"))


### Output###
> tmp
# 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

> identical(tmp, rec_data_table[, A_IDs.list := sapply(names_list, function(n) c(A_ids.DT[n, id]$id))])
# [1] TRUE

时间安排

我增加了 rec_data_table 中的行数至 1e5并得到以下时间。

有问题的方法:
> system.time(rec_data_table[, A_IDs.list := sapply(names_list, function(n) c(A_ids.DT[n, id]$id))])
user system elapsed
196.89 0.04 197.81

这里介绍的方法:
> system.time( {
+ tmp <- setkey(rec_data_ta .... [TRUNCATED]
user system elapsed
0.95 0.00 0.95

关于r - 匹配第二个表中的数据时,在 `data.table` 中创建一列向量的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14393194/

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