Используя r, преобразовать широкие данные опроса в длинные, учитывая, что ответы участников на похожие вопросы были записаны в разных столбцах? - PullRequest
0 голосов
/ 11 июня 2019

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

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

Я создал образец кадра данных, чтобы продемонстрировать свою проблему

library(data.table)

a1 <- rep(0,10)
a2 <- c(1:10)

b1 <- c(a2,a1,a1) 
b2 <- c(a1,a2,a1)
b3 <- c(a1,a1,a2)

df <-transpose(data.frame(b1,b2,b3))

В кадре данных показаны 30 столбцов, представляющих 10 вопросов для трех участников, все подряд.

В идеале конечный кадр данных должен выглядеть следующим образом:

library(data.table)
a2 <- c(1:10)
df2 <- transpose(data.frame(a2,a2,a2))

1 Ответ

1 голос
/ 11 июня 2019

Я уверен, что есть более короткий путь, но вот обратный путь:

library(tidyverse)
df %>%
  tibble::rowid_to_column("id") %>%
  gather(col, val, -id) %>%
  filter(val != 0) %>%
  group_by(id) %>%
  mutate(col = paste0("V", str_pad(row_number(), width = 2, pad = 0))) %>% 
  ungroup() %>%
  spread(col, val)

# A tibble: 3 x 11
     id   V01   V02   V03   V04   V05   V06   V07   V08   V09   V10
  <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     1     2     3     4     5     6     7     8     9    10
2     2     1     2     3     4     5     6     7     8     9    10
3     3     1     2     3     4     5     6     7     8     9    10
...