のために参照によりサブセットと割り当てがRのdata.table:ループ
正規表現とデータテーブルの名前のベクトルを考えるには、以下のように...よく...簡単なもののように思えるが、:
library(data.table)
regexes <- c(a="^A$")
dt <- fread("
a,A,1
a,B,1
b,A,1
")
入力データテーブルが
dt
# V1 V2 V3
# 1: a A 1
# 2: a B 1
# 3: b A 1
あるregexes
における第一の要素のための私の目標は、次のようになります。
V1=="a"
セットV3:=2
。 V2
が対応する正規表現^A$
と一致する場合を除き、V3:=3
。
(a
は、私はまた、より多くの名前とオーバーループに正規表現を得た。^A$
はregexes[1]
、2
と3
はデモの目的のためだけであるである、names(regexes)[1]
であり、データセットは、およそ300.000行です。)だから、
V1
はa
とV2
(01
# V1 V2 V3
# 1: a A 3 (*)
# 2: a B 2 (**)
# 3: b A 1
(*)3
ため期待出力であります)はV1
がa
とV2
(B
であるため)、
(**)2
を正規表現に一致する^A$
と一致していません。
私はこのようなサブセット化による正規表現とパイプをループにを試してみました:grepl
、期待どおりに動作しません...
for (x in seq(regexes))
dt[V1==names(regexes)[x], V3:=2][grepl(regexes[x], V2), V3:=3]
しかし...
dt
# V1 V2 V3
# 1: a A 3
# 2: a B 2
# 3: b A 3 <- wrong, should remain 2
V1=="a"
サブセットだけでなく、完全なV2
列を使用します。私もうまくいきましたが、時間がかかりました(つまり、data.tableを使用する方法ではありません)。
質問:ここに行く最良のデータテーブルの方法は?私はpackageVersion("data.table")
‘1.9.7’
を使用しています。
私はデータフレームの経路に行くことができることに注意してください。もちろん - - この
df <- as.data.frame(dt)
for (x in seq(regexes)) {
idx <- df$V1==names(regexes)[x]
df$V3[idx] <- 2
df$V3[idx][grepl(regexes[x], df$V2[idx])] <- 3 # or ifelse()
}
しかしように私は、可能な場合data.tableに戻し、その後data.frameにdata.tableを変換したくないでしょう。
ありがとうございます!予想通り
'dt [condition、blah:= boo]'は修正*完全* 'dt'を返します。最後に空の' [] 'を追加することで確認できます。追加の条件を '[]'の2番目のセットに追加してください。 – eddi
私はそれを試しました、しかし、 '' V1 == names(regexes)[x]とgrepl(regexes [x]、V2) 'を条件として使うと(すなわち、すべての' V2'に対して各正規表現にマッチさせます) 〜35秒かかりますが、データフレームの例は〜3です。だから私はそれが明らかにここに行く方法ではないと思った。 – lukeA
何か怪しいようです。減速が見られる大きな例を追加できますか? – eddi