2016-04-20 8 views
1

Я надеялся на некоторую помощь в извлечении последних N слов из столбца в таблице данных. А затем присвоении его новому столбцу.R: Извлечь последние N слов из столбца символов в data.table

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 = ' ')] 

и почти работает, за исключением того, что первое значение в столбце «добытого» повторяется в течение новой колонки:

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», которая дает мне последнее слово, но я не могу показаться обратным.

Любая помощь была бы принята с благодарностью!

ответ

4

я бы, вероятно, использовать

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)] 
    
3

Base 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