1

次のようなデータテーブルがあります。

> x
   part        colig
 1:   PR     PT, PMDB
 2: PMDB     PT, PMDB
 3: PMDB     PT, PMDB
 4:  PDT     PT, PMDB
 5: PMDB     PT, PMDB
 6:  PFL PSDB,PFL,PTB
 7:  PPB PSDB,PFL,PTB
 8: PMDB PSDB,PFL,PTB
 9: PMDB PSDB,PFL,PTB
10:  PPB PSDB,PFL,PTB
> str(x)
Classes ‘data.table’ and 'data.frame':  10 obs. of  2 variables:
 $ part : chr  "PR" "PMDB" "PMDB" "PDT" ...
 $ colig:List of 10
  ..$ : chr "PT" "PMDB"
  ..$ : chr "PT" "PMDB"
  ..$ : chr "PT" "PMDB"
  ..$ : chr "PT" "PMDB"
  ..$ : chr "PT" "PMDB"
  ..$ : chr  "PSDB" "PFL" "PTB"
  ..$ : chr  "PSDB" "PFL" "PTB"
  ..$ : chr  "PSDB" "PFL" "PTB"
  ..$ : chr  "PSDB" "PFL" "PTB"
  ..$ : chr  "PSDB" "PFL" "PTB"
 - attr(*, ".internal.selfref")=<externalptr> 

最初の変数が 2 番目の変数に含まれているときに 1 になるダミ​​ー変数を作成したいと考えています。私の望ましい出力は次のとおりです。

> x
    part        colig dummy
 1:   PR     PT, PMDB FALSE
 2: PMDB     PT, PMDB  TRUE
 3: PMDB     PT, PMDB  TRUE
 4:  PDT     PT, PMDB FALSE
 5: PMDB     PT, PMDB  TRUE
 6:  PFL PSDB,PFL,PTB  TRUE
 7:  PPB PSDB,PFL,PTB FALSE
 8: PMDB PSDB,PFL,PTB FALSE
 9: PMDB PSDB,PFL,PTB FALSE
10:  PPB PSDB,PFL,PTB FALSE

私の問題は、2 列目のリスト内の要素にアクセスすることです。私は次のようなことを試みています:

x[, dummy := x[,part] %in% x[, colig]]

また

x[, dummy := x[,part] %in% unlist(x[, colig])]

2 つのオプションは間違っています。最初のケースでは、ダミーは常に FALSE であり、2 番目のケースでは、unlist() コマンドは、(それぞれの行だけでなく) すべてのリストからの要素を含むリストを作成します。

私もlapplyで試しました(ここのようにR data.tableでダミー変数を作成しています):

x[, dummy := lapply( x[,part], function(y) y %in% unlist(x[,colig]))]

これは正しいと思いますが、行が多いため速度に問題があります。

より速いオプションはありますか?

4

3 に答える 3

2

grepl「部分」の各値で使用して実行します。

x[, dummy := grepl(part, colig), by = part]

OP を 2 回目に読んだとき、その列で何が起こっているのかわかりません。要素の一部はリストであり、他の要素は文字のようです。上記は文字に対して機能します(そしてlapply(colig, toString)、リストを文字列に変換するためにどこかに押し込むことができます)。

于 2015-07-30T20:42:06.897 に答える
1

で試してみてくださいstringi。速いはずです。

library(stringi)
x$dummy = stri_detect(x[,"colig"], fixed=x[,"part"])
#    part        colig dummy
# 2    PR     PT, PMDB FALSE
# 3  PMDB     PT, PMDB  TRUE
# 4  PMDB     PT, PMDB  TRUE
# 5   PDT     PT, PMDB FALSE
# 6  PMDB     PT, PMDB  TRUE
# 7   PFL PSDB,PFL,PTB  TRUE
# 8   PPB PSDB,PFL,PTB FALSE
# 9  PMDB PSDB,PFL,PTB FALSE
# 10 PMDB PSDB,PFL,PTB FALSE
# 11  PPB PSDB,PFL,PTB FALSE

またはとしてdata.table

setDT(x)[, dummy := stri_detect(colig, fixed=part)]

編集

リストと分離されていない文字列が混在しているように見える場合は、次のようなものを試してください

setDT(x)[, dummy := any(stri_detect(colig, fixed=part)), by=1:nrow(x)]
于 2015-07-30T19:48:20.767 に答える
0

出力からstr(x)、データに問題があるようです。の最初の数行はcolig分割されていないようです。つまり、「PT、PMDB」という単一の要素ではなく、「PT」、「PMDB」という 2 つの要素を持つことを意味している可能性があります。これが問題の一部である可能性があります。strsplit必要に応じて申請してください。

サンプルが代表的なものである場合は、単純に

apply(x,1,function(x) x$part %in% x$colig)

どこにxあるだけdata.frameでかなり速いはずです。あなたの修正版xを 100000 行にレプリケートしましたが、これは一瞬で実行されました。

于 2015-07-30T19:58:54.713 に答える