文字列列と、文字列の先頭から抽出する単語数を示す数値列を持つ data.table DT があります。
> require(data.table)
> DT <- data.table(string_col = c("A BB CCC", "DD EEE FFFF GDG", "AB DFD EFGD ABC DBC", "ABC DEF")
, first_n_words = c(2, 3, 3, 1))
> DT
string_col first_n_words
1: A BB CCC 2
2: DD EEE FFFF GDG 3
3: AB DFD EFGD ABC DBC 3
4: ABC DEF 1
次のように、string_col の最初の n 語を含む新しい列を追加したいと思います。
> output_DT
string_col first_n_words output_string_col
1: A BB CCC 2 A BB
2: DD EEE FFFF GDG 3 DD EEE FFFF
3: AB DFD EFGD ABC DBC 3 AB DFD EFGD
4: ABC DEF 1 ABC
これは、使用できる gsub 構文です。
> gsub(paste0("^((\\w+\\W+){", first_n_words - 1, "}\\w+).*$"),"\\1", string_col)
基本的に、その行の string_col に適用する前に、その行の first_n_words を使用して、すべての行に対してこの gsub 関数を作成する必要があります。非常に大きなデータセットであるため、data.table 構文ソリューションにのみ関心があります。gsub ソリューションが最も望ましいでしょう。
編集:私は次のことを試しましたが、うまくいきません
> DT[, output_string_col := gsub(paste0("^((\\w+\\W+){", first_n_words - 1, "}\\w+).*$"),"\\1", string_col)]
Warning message:
In gsub(paste0("^((\\w+\\W+){", first_n_words - 1, "}\\w+).*$"), :
argument 'pattern' has length > 1 and only the first element will be used
>## This is not the desired output
> DT
string_col first_n_words output_string_col
1: A BB CCC 2 A BB
2: DD EEE FFFF GDG 3 DD EEE
3: AB DFD EFGD ABC DBC 3 AB DFD
4: ABC DEF 1 ABC DEF
これは望ましい出力ではありません