使用r将给定参与者对类似问题的答案捕获在不同列中的答案,将广泛的调查数据转换为长数据?

时间:2019-06-11 16:49:28

标签: r dplyr tidyr survey

我想将调查数据从一个宽格式转换为一个长格式,特别是根据先前的过滤问题,总结几个相同问题的列,但由调查工具将其分为不同的列,相应地过滤了参与者。

以前,我尝试使用tidyr的collect()函数解决该问题。问题是我要收集大量列,并且我不想手动指定要收集的每个列。

我创建了一个示例数据框来展示我的问题

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个问题,接columns而至。

理想情况下,最终数据帧应如下所示:

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

1 个答案:

答案 0 :(得分:1)

我敢肯定有一个较短的方法,但是这是一个整洁的方法:

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