Проблема разделения длинных форматов - PullRequest
1 голос
/ 04 февраля 2020

Из этого фрейма данных:

dftest <-  data.frame(id = c(1), text = c("java-ee?jsf?omnifaces?jpa"), stringsAsFactors = F)

Я хотел бы создать такой фрейм данных

data.frame(id = c(1), java-ee = c(1), jsf = c(1), onifaces = c(1), jpa = c(1))

Я использую эти команды, чтобы сделать это:

s2 <- strsplit(dftest$text, split = "?")
dftest2 <- data.frame(id = rep(dftest2$id, sapply(s2, length)), text = unlist(s2))

dflike_final <- reshape(dftest2, idvar = "id", timevar = "text", direction = "wide")

Каковы результаты первых двух строк:

 id text
1   1         j
2   1         a
3   1         v
4   1         a
5   1         -
6   1         e
7   1         e
8   1         ?
9   1         j
10  1         s
11  1         f
12  1         ?
13  1         o
14  1         m
15  1         n
16  1         i
17  1         f
18  1         a
19  1         c
20  1         e
21  1         s
22  1         ?
23  1         j
24  1         p
25  1         a

Как я могу исправить это, чтобы получить всю строку?

1 Ответ

2 голосов
/ 04 февраля 2020

Мы можем объединить text в отдельные строки, создать фиктивный столбец (n) и получить данные в широком формате, используя pivot_wider.

library(dplyr)
library(tidyr)

dftest %>%
  separate_rows(text, sep = "\\?") %>%
  mutate(n = 1) %>%
  pivot_wider(values_from = n, names_from = text)

# A tibble: 1 x 5
#     id `java-ee`   jsf omnifaces   jpa
#  <dbl>     <dbl> <dbl>     <dbl> <dbl>
#1     1         1     1         1     1

Как уже упоминалось @Roland ? - это специальный символ в регулярном выражении, мы должны его избежать. Также вам необходимо включить фиктивный столбец при создании нового фрейма данных. Затем вы можете использовать вашу попытку как

s2 <- strsplit(dftest$text, split = "\\?")
dftest2 <- data.frame(id = rep(dftest$id, lengths(s2)), text = unlist(s2), n = 1)
dflike_final <- reshape(dftest2, idvar = "id", timevar = "text", direction = "wide")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...