Добавить столбец списка в фрейм данных
У меня есть фрейм данных со 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 возвращает список, поэтому у вашего фрейма данных теперь есть настоящий список-столбец. (Здесь было найдено регулярное выражение с разделением строк)
Что если я хочу разделить столбец списка на несколько строк?
Чтобы разделить элементы этого списка на их собственные строки, у вас есть два варианта:
просто позвоните
tidyr::unnest
в списке-столбце:df %>% tidyr::unnest(text)
использование
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