R:从 data.table 中的字符列中提取最后 N 个词
R: Extract last N words from character column in data.table
我希望得到一些帮助,从 data.table.. 中的一列中提取最后 N 个词,然后将其分配给一个新列。
test <- data.table(original = c('the green shirt totally brings out your eyes'
, 'ford focus hatchback'))
原来的data.table是这样的:
original
1: the green shirt totally brings out your eyes
2: ford focus hatchback
我想将(最多)最后 5 个单词子集化到一个新列中,所以输出看起来像:
original extracted
1: the green shirt totally brings out your eyes totally brings out your eyes
2: ford focus hatchback ford focus hatchback
我试过了:
test <- test[, extracted := paste0(tail(strsplit(original, ' ')[[1]], 5)
, collapse = ' ')]
它几乎可以工作,除了 'extracted' 列中的第一个值在整个新列中重复:
original extracted
1: the green shirt totally brings out your eyes totally brings out your eyes
2: ford focus hatchback totally brings out your eyes
我这辈子都想不通。我尝试了 'stringr' 中的 'word' 函数,它给了我最后一个词,但我似乎无法倒数。
如有任何帮助,我们将不胜感激!
基础 R 解决方案:
test[,extracted:=sapply(strsplit(original,'\s+'),function(v) paste(collapse=' ',tail(v,5L)))];
## original extracted
## 1: the green shirt totally brings out your eyes totally brings out your eyes
## 2: ford focus hatchback ford focus hatchback
我可能会使用
n = 5
patt = sprintf("\w+( \w+){0,%d}$", n-1)
library(stringi)
test[, ext := stri_extract(original, regex = patt)]
original ext
1: the green shirt totally brings out your eyes totally brings out your eyes
2: ford focus hatchback ford focus hatchback
评论:
- 如果您设置
n=0
,这会中断,但可能没有充分的理由这样做。
- 这是矢量化的,以防你有
n
不同的行(例如,n=3:4
)。
@eddi 提供了一个基础类似物(固定n
):
test[, ext := sub('.*?(\w+( \w+){4})$', '\1', original)]
我希望得到一些帮助,从 data.table.. 中的一列中提取最后 N 个词,然后将其分配给一个新列。
test <- data.table(original = c('the green shirt totally brings out your eyes'
, 'ford focus hatchback'))
原来的data.table是这样的:
original
1: the green shirt totally brings out your eyes
2: ford focus hatchback
我想将(最多)最后 5 个单词子集化到一个新列中,所以输出看起来像:
original extracted
1: the green shirt totally brings out your eyes totally brings out your eyes
2: ford focus hatchback ford focus hatchback
我试过了:
test <- test[, extracted := paste0(tail(strsplit(original, ' ')[[1]], 5)
, collapse = ' ')]
它几乎可以工作,除了 'extracted' 列中的第一个值在整个新列中重复:
original extracted
1: the green shirt totally brings out your eyes totally brings out your eyes
2: ford focus hatchback totally brings out your eyes
我这辈子都想不通。我尝试了 'stringr' 中的 'word' 函数,它给了我最后一个词,但我似乎无法倒数。
如有任何帮助,我们将不胜感激!
基础 R 解决方案:
test[,extracted:=sapply(strsplit(original,'\s+'),function(v) paste(collapse=' ',tail(v,5L)))];
## original extracted
## 1: the green shirt totally brings out your eyes totally brings out your eyes
## 2: ford focus hatchback ford focus hatchback
我可能会使用
n = 5
patt = sprintf("\w+( \w+){0,%d}$", n-1)
library(stringi)
test[, ext := stri_extract(original, regex = patt)]
original ext
1: the green shirt totally brings out your eyes totally brings out your eyes
2: ford focus hatchback ford focus hatchback
评论:
- 如果您设置
n=0
,这会中断,但可能没有充分的理由这样做。 - 这是矢量化的,以防你有
n
不同的行(例如,n=3:4
)。 @eddi 提供了一个基础类似物(固定
n
):test[, ext := sub('.*?(\w+( \w+){4})$', '\1', original)]