我想将调查数据从一个宽格式转换为一个长格式,特别是根据先前的过滤问题,总结几个相同问题的列,但由调查工具将其分为不同的列,相应地过滤了参与者。
以前,我尝试使用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))
答案 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