Свертывание одинаковых строк из нескольких столбцов в одном столбце - PullRequest
0 голосов
/ 21 июня 2019

Мне нужно преобразовать вложенный набор данных в плоский.

Мой набор данных выглядит следующим образом:

UserID   Test
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z
<p>B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y
<p>B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z

Каждый пользователь выполнил разное количество тестов, и их порядокпроизвольны.X, Y и Z означают имена тестов единой строки.

Мне нужно, чтобы это выглядело так:

UserID &nbsp;X &nbsp;&nbsp; Y &nbsp;&nbsp; Z 
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &nbsp;&nbsp; 1 &nbsp;&nbsp; 1 &nbsp;&nbsp;
<p>B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 &nbsp;&nbsp; 1 &nbsp;&nbsp; 1 &nbsp;&nbsp;

1 - завершен тест;0 - не завершил тест.

Другими словами, мне нужно выполнить какой-то токенизацию, но из нескольких столбцов (не одной строки).

Буду признателен за любые советы о том, какчтобы сделать это.Спасибо!

Я преобразовал набор данных, используя UserId в качестве идентификатора, но результирующий набор данных имеет столько столбцов, сколько наибольшее количество выполненных тестов любым пользователем (что хорошо), но идентичные тесты выровнены по пользователям (например,Первый столбец для пользователя A содержит X, потому что пользователь A первым выполнил тест X, а Y для пользователя B, потому что пользователь не выполнил тест X или не выполнил тесты в том же порядке).

1 Ответ

0 голосов
/ 21 июня 2019

Опция будет

library(dplyr)
library(tidyr)
df1 %>%
  extract(Test, into = c("Test", "colNm"), sep= "(.*);[^;]+$") %>%
  mutate(colNm = str_c(colNm, "&nbsp", sep="_")) %>%
  group_by(UserID) %>%
  mutate(rn = row_number()) %>%      
  spread(colNm, Test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...