Извлечь все слова из строки и создать столбец с результатом

У меня есть фрейм данных (data3) со столбцом с именем «Коллектор». В этом столбце у меня есть буквенно-цифровые символы. Например: «Руис и Гальвис 650». Мне нужно извлечь альфа-символы и числовые символы отдельно и создать два новых столбца, один с номерами этой строки (ColID), а другой со всеми словами (Col):

ВХОД:

Collector                       Times     Sample
Ruiz and Galvis 650             9         SP.1              
Smith et al 469                 8         SP.1

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

Collector                       Times     Sample     ColID    Col
Ruiz and Galvis 650             9         SP.1        650     Ruiz and Galvis
Smith et al 469                 8         SP.1        469     Smith et al

Я пробовал следующее, но когда я пытаюсь сохранить файл, я получаю сообщение об ошибке (Ошибка в .External2 (C_writetable, x, file, nrow (x), p, rnames, sep, eol,: нереализованный тип «список» в « КодироватьЭлемент'):

regexp <- "[[:digit:]]+"
data3$colID<- NA
data3$colID <- str_extract (data3$Collector, regexp)

data3$Col<- NA
regexp <-"[[:alpha:]]+"
data3$Col <- (str_extract_all (data3$Collector, regexp))
write.table(data3, file = paste("borrar2",".csv", sep=""), quote=T, sep = ",", row.names = F)

person Tac_For    schedule 24.09.2016    source источник


Ответы (2)


Проблема в том, что str_extract_all находит не одну строку, а список из нескольких. Например:

> dput(str_extract_all("Ruiz and Galvis 650", "[[:alpha:]]+"))
list(c("Ruiz", "and", "Galvis"))

Фрейм данных с вложенными элементами (как указано выше), по-видимому, не может быть сохранен в файл.

Однако, если вы обновите шаблон регулярного выражения, чтобы он соответствовал пробелам и буквам, вы можете вернуться к использованию str_extract вместо этого:

> dput(str_extract("Ruiz and Galvis 650", "[[:alpha:] ]+"))
"Ruiz and Galvis "

Обратите внимание на пробел во втором регулярном выражении. Это соответствует всем буквам/пробелам как одной строке и позволит вам записать data.frame в файл.

person user12341234    schedule 25.09.2016

Если ваши данные так же однородны, как показывает ваш пример, то это еще один вариант:

library(stringi)
library(purrr)
library(dplyr)

df <- data.frame(Collector=c("Ruiz and Galvis 650", "Smith et al 469"),
                 Times=c(9, 8),
                 Sample=c("SP.1", "SP.1"),
                 stringsAsFactors=FALSE)

stri_match_first(df$Collector, regex="([[:alpha:][:space:]]+) ([[:digit:]]+)") %>% 
  as.data.frame(stringsAsFactors=FALSE) %>% 
  select(Col=V2, ColID=V3) %>% 
  bind_cols(df) %>% 
  select(-Collector)
##               Col ColID Times Sample
## 1 Ruiz and Galvis   650     9   SP.1
## 2     Smith et al   469     8   SP.1
person hrbrmstr    schedule 25.09.2016
comment
Спасибо за это! Ваш ответ напомнил мне еще несколько вещей по теме. - person Tac_For; 26.09.2016