группировка по неструктурированным текстовым столбцам для сводных данных - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть некоторые текстовые данные, которые выглядят так:

   ID                      text
1                              
2                              
3                              
4  HD                 some text
5  LP            some more text
6  AN            even more text
7                              
8                              
9                              
10 HD       some different text
11 SN  some more different text
12 AN  even more different text

Ea c часть является документом и отделена пробелами. Документ начинается с ID как HD и заканчивается ID и AN. Я пытаюсь сделать две вещи, в конечном итоге я хочу pivot_wider данных и иметь столбцы как ID, и каждая строка будет документ. Я запускаю следующее:

widerText <- textData %>% 
  pivot_wider(names_from = ID, values_from = text)


finalText <- widerText %>% 
  unnest(HD, LP, AN, SN, PP, LO, AN)

, который не сохраняет правильную структуру, и текст перепутывается. Итак, я хочу создать группирующую переменную до запуска pivot_wider.

Каждый документ начинается с HD и заканчивается AN, поэтому я хотел бы создать что-то со следующим выводом:

Ожидаемый вывод:

   ID                      text   grp
1                                  0
2                                  0
3                                  0
4  HD                 some text    1
5  LP            some more text    1
6  AN            even more text    1
7                                  0
8                                  0
9                                  0
10 HD       some different text    2
11 SN  some more different text    2
12 AN  even more different text    2

Данные :

textData <- data.frame(
  ID = c(
    " ", " ", " ", "HD", "LP", "AN",
    " ", " ", " ", "HD", "SN", "AN",
    " ", " ", " ", "HD", "PP", "AN",
    " ", " ", " ", "HD", "LO", "AN"

    ),
  text = c(
    " ", " ", " ", "some text", "some more text", "even more text",
    " ", " ", " ", "some different text", "some more different text", "even more different text",
    " ", " ", " ", "some additional text", "some more additional text", "even more additional text",
    " ", " ", " ", "some extra text", "some more extra text", "even more extra text"
    )
)

Ответы [ 3 ]

3 голосов
/ 22 апреля 2020

Вы можете использовать cumsum на textData$ID == "HD", чтобы получить группы, и установить пустые на 0, используя ifelse.

textData$grp <- ifelse(textData$ID==" ", 0, cumsum(textData$ID == "HD"))
textData
#   ID                      text grp
#1                                 0
#2                                 0
#3                                 0
#4  HD                 some text   1
#5  LP            some more text   1
#6  AN            even more text   1
#7                                 0
#8                                 0
#9                                 0
#10 HD       some different text   2
#11 SN  some more different text   2
#12 AN  even more different text   2
#13                                0
#14                                0
#15                                0
#16 HD      some additional text   3
#17 PP some more additional text   3
#18 AN even more additional text   3
#19                                0
#20                                0
#21                                0
#22 HD           some extra text   4
#23 LO      some more extra text   4
#24 AN      even more extra text   4
2 голосов
/ 22 апреля 2020

Опция с case_when

library(dplyr)
textData %>%
   mutate(grp_id = case_when(ID==" " ~ 0,
           TRUE ~  cumsum(ID == "HD")))
1 голос
/ 22 апреля 2020
setDT(textData)[,grp_id:=fifelse(ID==" ",0,rleid(ID==" ")/2)]

или используя rleid

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