Изменять от длинного к широкому на основе соответствия регулярному выражению в dplyr - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть набор данных, в котором есть ряд столбцов, которым предшествует следующее соглашение "викторина {число между 1-33}. {Имя_переменной}".Так, например, "quiz.1.player.trial_counter" или "quiz.33.submitted_answer"

В настоящее время я собираю эти столбцы следующим образом:

 dat[, c(names(data[, grep('quiz\\.[0-9]*.',  names(dat))]))]

Каждая строкаиндивидуальные ответы.Я хочу иметь столбец, который извлекает число из каждого из предисловий теста, и другой столбец, описывающий переменную.

Допустим, у меня есть этот упрощенный набор данных:

dat <- read.table(text="ID quiz.1.player.question quiz.1.player.solution quiz.2.player.question quiz.2.player.solution 
Trx1 A Yes 4 No
Trx1 B Maybe 5 No
Trx2 E No 6 Why
Trx2 B Yes 8 Yes
Trx3 B Definitely 9 Maybe
Trx3 C Yes 8 Yes
Trx5 F No 7 Why
Trx5 D Maybe 0 Ha", header=T)

Вот часть желаемого примера вывода

output <- read.table(text="id quiz_number key value
Trx1 1 player.question A
Trx1 1 player.solution Yes
Trx1 2 player.question 4
Trx1 2 player.solution No
Trx2 1 player.question B
", header=T)

Я пробовал разные вещи с gather иseparate и extract, но не могу понять, как добиться желаемого эффекта.

1 Ответ

0 голосов
/ 25 сентября 2018

Что касается решения tidyverse, мы можем изменить данные с широкого на длинный, а затем separate записей, чтобы воспроизвести ожидаемый формат вывода.

library(tidyverse)
dat %>%
    gather(k, value, -ID) %>%
    separate(k, c("quiz_number", "key"), "\\.(?=player)") %>%
    mutate(quiz_number = str_replace(quiz_number, "quiz\\.", ""))
#     ID quiz_number             key      value
#1  Trx1           1 player.question          A
#2  Trx1           1 player.question          B
#3  Trx2           1 player.question          E
#4  Trx2           1 player.question          B
#5  Trx3           1 player.question          B
#6  Trx3           1 player.question          C
#7  Trx5           1 player.question          F
#8  Trx5           1 player.question          D
#9  Trx1           1 player.solution        Yes
#10 Trx1           1 player.solution      Maybe
#11 Trx2           1 player.solution         No
#12 Trx2           1 player.solution        Yes
#13 Trx3           1 player.solution Definitely
#14 Trx3           1 player.solution        Yes
#15 Trx5           1 player.solution         No
#16 Trx5           1 player.solution      Maybe
#17 Trx1           2 player.question          4
#18 Trx1           2 player.question          5
#19 Trx2           2 player.question          6
#20 Trx2           2 player.question          8
#21 Trx3           2 player.question          9
#22 Trx3           2 player.question          8
#23 Trx5           2 player.question          7
#24 Trx5           2 player.question          0
#25 Trx1           2 player.solution         No
#26 Trx1           2 player.solution         No
#27 Trx2           2 player.solution        Why
#28 Trx2           2 player.solution        Yes
#29 Trx3           2 player.solution      Maybe
#30 Trx3           2 player.solution        Yes
#31 Trx5           2 player.solution        Why
#32 Trx5           2 player.solution         Ha
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...