data.table
2番目の要素を一致させる必要がある場所にベクトルの列を作成する最も効率的な方法は何ですかdata.table
。
たとえば、以下の2つの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
いるIDのリストである新しい列を作成したいと思います。A_ids.DT
rec_data_table[,names_list]
重要:の各エントリに示されている順序はnames_list
、新しい列に反映されている必要があります。つまり、行3:
(H, E, G
)の場合は次のようになりますc(8, NA, 7)
次の行はsapply
作品を使用していますが、その効率には疑問があります。
より良い(つまり、より速く、よりエレガントな)選択肢はありますか?(実際のデータは数百K行であることに注意してください)
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")