3

この質問は、この前の質問のフォローアップです。

ID のベクトルがありsampleIDsます。また、rec_data_table入札によってキーが 付けられA_IDs.list、各要素が aID のコレクション (ベクトル) である列を含む data.table があります。

sampleIDsおよび
For each を含む 2 番目の data.table を作成したいと思います。 その aID が列に表示されるaIDすべての bID の対応するベクトルがあります。
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、ラップ
オーバー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)
4

3 に答える 3

2

tmp前の質問に対する私の回答でto を結合した後、 を検索することでA_ids.DT目的の出力を取得できます。sampleIDstmp

# ... 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ただし、これら 2 つの質問では、列の大文字と小文字が異なることに注意してください。もちろん、これは、サンプル データの最後から 2 番目の行を実行していないことを前提としています。のバイナリ検索の%in%驚異により、多くのレコードがある場合、これはベースのアプローチよりも高速になるはずです。data.table

于 2013-01-18T18:02:27.400 に答える
1

これにより、目的の出力が得られると思います:

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、長い data.table を取得できます。

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

上記のネストされたリスト構成ではなく、「長い」データを使用することをお勧めします。これは、コードがはるかに単純になることが多いためです。

于 2013-01-18T16:28:46.897 に答える
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)

もっと速い方法があるかもしれませんが、これはうまくいきます。:)

于 2013-01-18T16:37:07.227 に答える