Добавить столбец списка в фрейм данных

У меня есть фрейм данных со 100 строками. У меня есть столбец в фрейме данных, который состоит из текста. Я хотел бы разделить текстовый столбец на предложения, чтобы текстовый столбец стал списком предложений. Я делю с помощью функции пакета stringi stri_split_lines

Пример:

rowID       text
1         There is something wrong. It is bad. We made it better
2          The sky is blue. The sea is green.

Желаемый вывод

rowID       text 
1           [1] There is something wrong
            [2]It is bad. 
            [3]We made it better
2           [1]The sky is blue.
            [2]The sea is green.

я пытался

dataframe<-do.call(rbind.data.frame, stri_split_lines(dataframe$text, omit_empty = TRUE))

3 ответа

Решение

Здесь вы идете, решение от Tidyverse (и больше не используя stringi):

Предположим, ваш фрейм данных называется df,

Решение

  library(dplyr)

  df %>%
    mutate(text= strsplit(text, "(?<=[[:punct:]])\\s(?=[A-Z])", perl=T)) 

Пояснение: strsplit в вызове mutate возвращает список, поэтому у вашего фрейма данных теперь есть настоящий список-столбец. (Здесь было найдено регулярное выражение с разделением строк)

Что если я хочу разделить столбец списка на несколько строк?

Чтобы разделить элементы этого списка на их собственные строки, у вас есть два варианта:

  1. просто позвоните tidyr::unnest в списке-столбце:

    df %>% tidyr::unnest(text)
    
  2. использование tidyr::separate_rows на исходном кадре данных (до создания списка-столбца):

    df %>% tidyr::separate_rows(text, sep= "(?<=[[:punct:]])\\s(?=[A-Z])")
    

Пример:

dataframe[["text"]] <- strsplit(dataframe[["text"]], split = "\\.")
str(dataframe)

'data.frame':   2 obs. of  2 variables:
 $ rowID: int  1 2
 $ text :List of 2
  ..$ : chr  "There is something wrong" " It is bad" " We made it better"
  ..$ : chr  "The sky is blue" " The sea is green"

Данные

dataframe <- data.frame(
  rowID = 1:2, 
  text = 
    c(
      "There is something wrong. It is bad. We made it better",
      "The sky is blue. The sea is green."
    ),
  stringsAsFactors = FALSE
)

Рассматривать DF ваш data.frame:

DF <- read.table(text=
'rowID       text
1         "There is something wrong. It is bad. We made it better"
2          "The sky is blue. The sea is green."', header=TRUE, stringsAsFactors=FALSE)

Затем, используя базовые функции R, вы можете получить желаемый результат:

listText <- lapply(strsplit(DF$text, "\\."), cbind)
id <- rep(1:length(listText), lengths(listText))
data.frame(rowID = id, text = do.call(rbind, listText))

Выход:

  rowID                     text
1     1 There is something wrong
2     1                It is bad
3     1        We made it better
4     2          The sky is blue
5     2         The sea is green
Другие вопросы по тегам