Разделение столбца с использованием больших пробелов в строках в R - PullRequest
0 голосов
/ 17 октября 2018

Это мой фрейм данных, состоящий только из 1 наблюдения.Это длинная строка, в которой можно идентифицировать 4 разные части:

example <- "4.6             (19 ratings)                                                         Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of rating and reliability, to ensure that they reflect course quality fairly and accurately.                                                                                                            151 students enrolled                                                                    "
df <- data.frame(example)

Как видите, первое наблюдение состоит из строки, состоящей из 4 разных частей: рейтинг (4.6), количество оценок (19 оценок)), предложение (курс ... точно) и зачисленные студенты (151).

Я использовал функцию separate(), чтобы разделить этот столбец на 4:

df1 <- separate(df, example, c("Rating", "Number of rating", "Sentence", "Students"), sep = "     ")

Таким образом, это не ведет себя как ожидалось.

Любая идея.

ОБНОВЛЕНИЕ :

Это то, что я получаю с вашим комментарием @nicola

> df1 <- separate(df, example, c("Rating", "Number of rating", "Sentence", "Students"), sep=" {4,}")
Warning message:
Expected 4 pieces. Additional pieces discarded in 1 rows [1].

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Конечно возможно с пакетом stringr и небольшим количеством регулярных выражений:

  rating_mean n_ratings n_students                         descr
1        4.65        19        151    "Course (...) accurately."

Код

library(stringr)

# create result data frame
result <- data.frame(cbind(rating_mean = 0, n_ratings = 0, n_students = 0, descr = 0))

# loop through rows of example data frame
for (i in 1:nrow(df)){
    # replace spaces
    example[i, 1] <- gsub("\\s+", " ", example[i, 1])
    # match and extract mean rating
    result[i, 1] <- as.numeric(str_match(example[i], "^[0-9]+\\.[0-9]+"))
    # match and extract number of ratings
    result[i, 2] <- as.numeric(str_match(str_match(example[i, 1], "\\(.+\\)"), "[0-9]+"))
    # match and extract number of enrolled students
    result[i, 3] <- as.numeric(str_match(str_match(example[i, 1], "\\s[0-9].+$"), "[0-9]+"))
    # match and extract sentence
    result[i, 4] <- str_match(example[i, 1], "[A-Z].+\\.")
}

Данные

example <- "4.65             (19 ratings)                                                         Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of rating and reliability, to ensure that they reflect course quality fairly and accurately.                                                                                                            151 students enrolled                                                                    "
example <- data.frame(example, stringsAsFactors = FALSE)
0 голосов
/ 17 октября 2018

Как насчет этого:

x <- str_split(example, "  ") %>%
    unlist()
x <- x[x != ""]
df <- tibble("a", "b", "c", "d")
df[1, ] <- x
colnames(df) <- c("Rating", "Number of rating", "Sentence", "Students")

> str(df)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   1 obs. of  4 variables:
 $ Rating          : chr "4.6"
 $ Number of rating: chr " (19 ratings)"
 $ Sentence        : chr " Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of ra"| __truncated__
 $ Students        : chr "151 students enrolled"
0 голосов
/ 17 октября 2018

Есть два ключа к ответу.Первое относится к правильному регулярному выражению, используемому в качестве разделителя sep = "[[:space:]]{2,}", что означает два или более пробела (\\s{2,} будет более распространенным альтернативным вариантом).Во-вторых, ваш пример на самом деле имеет много пробелов, которые separate() пытается поместить в другой столбец.Его можно просто удалить с помощью trimws().Поэтому решение выглядит следующим образом:

library(tidyr)
library(dplyr)

example <- "4.6             (19 ratings)                                                         Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of rating and reliability, to ensure that they reflect course quality fairly and accurately.                                                                                                            151 students enrolled                                                                    "
df <- data.frame(example)

df_new <- df %>%
  mutate(example = trimws(example)) %>% 
  separate(col = "example", 
           into = c("rating", "number_of_ratings", "sentence", "students_enrolled"), 
           sep = "[[:space:]]{2,}")




as_tibble(df_new)
    # A tibble: 1 x 4
      rating number_of_ratings sentence                                                                    students_enrolled
      <chr>  <chr>             <chr>                                                                       <chr>            
    1 4.6    (19 ratings)      Course Ratings are calculated from individual students’ ratings and a vari~ 151 students enr~

tibble используется только для форматирования вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...