Фрейм данных и интеллектуальный анализ текста - PullRequest
0 голосов
/ 29 мая 2020
library(stringr)
data<-data.frame(id=c(1,2,3), 
          text=c("This is (2020) text; mining exercise (1999)","Text analysis (1975) is; bit confusing (2012)","Hint (1998) on; this text (2007) analysis?"))

a <- b <- list()
mm <- data.frame(a=NA,b=NA)
for(i in 1:length(data$text)){
   a[[i]] <- lengths(strsplit(as.character(data$text[i]),";"))
   b[[i]] <- str_count(data$text[i], "\\(19[0-9]{2}\\)|\\(20[0-9]{2}\\)")
}

Вывод, который я получаю:

# mm
    a     b
1  NA     NA

Почему я не получаю соответствующие значения для каждой строки фрейма данных mm? Код не содержит ошибок.

Ожидаемый результат:

# mm
   a   b
1  2   2
2  2   2
3  2   2

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

После завершения l oop у вас есть два списка, a и b с ожидаемым результатом:

a
[[1]]
[1] 2

[[2]]
[1] 2

[[3]]
[1] 2

Но вы никогда не назначаете эти значения своему data.frame:

mm <- data.frame(a=unlist(a),b=unlist(b))
mm
  a b
1 2 2
2 2 2
3 2 2
1 голос
/ 29 мая 2020

Вариант с tidyverse

library(dplyr)
library(stringr)
library(purrr)
data %>% 
   transmute(out = str_split(text, ";")) %>% 
   transmute(a = lengths(out),
       b = lengths(map(out, ~ str_extract(.x, "(?<=(19|20))[0-9]{2}\\b"))))
#  a b
#1 2 2
#2 2 2
#3 2 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...