Помощь с преобразованием интенсивных продольных данных в R - PullRequest
0 голосов
/ 08 января 2020

Извинения, если я не публикую правильно. Я новичок в R, и это мой первый пост в stackoverflow. Я прочитал столько, сколько могу, чтобы найти решение моей проблемы, но не смог найти то, что я мог бы использовать.

У меня есть некоторые интенсивные продольные данные, которые я пытаюсь изменить. В настоящее время он находится в широком формате и выглядит примерно так:

Participant   D1_1_1   D1_1_2   D1_1_3   D1_1_4    D2_1_1   D2_1_2  etc...
P1               6        2        3        5        1         2
P2               4        9        3        6        4         1
P3               7        4        2        8        1         1
P4               1        5        1        1        6         7 
P5               2        0        8        2        1         4
etc..

Переменные столбца относятся к ответам на конкретный элемент опроса c, сделанные в определенный день, в определенное время в течение дня.

Итак:

D1_1_1 = день 1, время 1, элемент 1

D1_1_2 = день 1, время 1, элемент 2

...

D4_3_7 = день4, время 3, пункт 7

В общей сложности у меня есть данные: 60 участников, которые ответили на 11 вопросов, 4 раза в день, в течение 10 дней (всего из 440 точек данных на участника).

Мне нужна помощь для возможности эффективно управлять этим в длинном формате, чтобы он выглядел, например, так:

Participant     Day     time    item 1   item 2 ... item 11
P1               1        1        6        2
P1               1        2        X        X
P1               1        3        X        X
P1               1        4        X        X
P1               2        1        1        4
etc..

Где X - ответ участника на определенный элемент опроса, в определенный день, в определенное время.

Любая помощь будет высоко ценится!

Приветствия

Ответы [ 2 ]

1 голос
/ 08 января 2020

Ответ Ронака работает отлично, но нет необходимости использовать extract: pivot_longer может уже разбить столбец на несколько:

library(tidyr)

df %>%
  pivot_longer(cols = -Participant, names_to = c("day", "time", "item"), 
               names_pattern = "(D\\d)_(\\d)_(\\d)") %>%
  pivot_wider(names_from = item, values_from = value, names_prefix = "Item")
#> # A tibble: 10 x 7
#>    Participant day   time  Item1 Item2 Item3 Item4
#>    <fct>       <chr> <chr> <int> <int> <int> <int>
#>  1 P1          D1    1         6     2     3     5
#>  2 P1          D2    1         1     2    NA    NA
#>  3 P2          D1    1         4     9     3     6
#>  4 P2          D2    1         4     1    NA    NA
#>  5 P3          D1    1         7     4     2     8
#>  6 P3          D2    1         1     1    NA    NA
#>  7 P4          D1    1         1     5     1     1
#>  8 P4          D2    1         6     7    NA    NA
#>  9 P5          D1    1         2     0     8     2
#> 10 P5          D2    1         1     4    NA    NA

Данные:

df <- structure(list(Participant = structure(1:5, .Label = c("P1", 
"P2", "P3", "P4", "P5"), class = "factor"), D1_1_1 = c(6L, 4L, 
7L, 1L, 2L), D1_1_2 = c(2L, 9L, 4L, 5L, 0L), D1_1_3 = c(3L, 3L, 
2L, 1L, 8L), D1_1_4 = c(5L, 6L, 8L, 1L, 2L), D2_1_1 = c(1L, 4L, 
1L, 6L, 1L), D2_1_2 = c(2L, 1L, 1L, 7L, 4L)), class = "data.frame", 
row.names = c(NA, -5L))
0 голосов
/ 08 января 2020

Вот один способ с pivot_longer + pivot_wider

library(dplyr)
library(tidyr)

pivot_longer(df, cols = -Participant, names_to = c("Day", "Time", "Item"), 
                 names_pattern = "D(\\d+)_(\\d+)_(\\d+)") %>%
    mutate(Item = paste0("Item",Item)) %>%
    pivot_wider(names_from = Item, values_from = value)

# A tibble: 10 x 7
#   Participant Day   Time  Item1 Item2 Item3 Item4
#   <fct>       <chr> <chr> <int> <int> <int> <int>
# 1 P1          1     1         6     2     3     5
# 2 P1          2     1         1     2    NA    NA
# 3 P2          1     1         4     9     3     6
# 4 P2          2     1         4     1    NA    NA
# 5 P3          1     1         7     4     2     8
# 6 P3          2     1         1     1    NA    NA
# 7 P4          1     1         1     5     1     1
# 8 P4          2     1         6     7    NA    NA
# 9 P5          1     1         2     0     8     2
#10 P5          2     1         1     4    NA    NA

Мы также можем использовать extract, используя тот же шаблон, что и names_pattern в pivot_longer

pivot_longer(df, cols = -Participant) %>%
     extract(name, into = c("Day", "Time", "Item"), 
             regex = "D(\\d+)_(\\d+)_(\\d+)") %>%
     pivot_wider(names_from = Item, values_from = value)

данные

df <- structure(list(Participant = structure(1:5, .Label = c("P1", 
"P2", "P3", "P4", "P5"), class = "factor"), D1_1_1 = c(6L, 4L, 
7L, 1L, 2L), D1_1_2 = c(2L, 9L, 4L, 5L, 0L), D1_1_3 = c(3L, 3L, 
2L, 1L, 8L), D1_1_4 = c(5L, 6L, 8L, 1L, 2L), D2_1_1 = c(1L, 4L, 
1L, 6L, 1L), D2_1_2 = c(2L, 1L, 1L, 7L, 4L)), class = "data.frame", 
row.names = c(NA, -5L))
...