R将collect用于调查数据中的多个循环

问题描述

我正在处理一些稍显尴尬的调查数据。调查软件的输出格式为:

Respondent     contact1     contact2     question1     question2     question1     question2
   Tim           Bob          Alan           1             0             0             1

位置:

Contact1和contact2是被调查者可以在其中列出与之联系的个人的插槽。

然后为每个联系人循环以下固定问题集,每个问题都是一个新列。答案记录为简单的1或0。

我希望将这些数据重塑为更易于分析的布局:

Respondent     Contact    question1    question2
   Tim           Bob          1            0
   Tim           Alan         0            1

显然,这是简化的,实际的数据集有100个联系人,每个联系人大约有8个问题,但布局是相同的。

我认为最好的方法是结合使用collect(),express()和spread()

data %>%
  gather(key,value,-Respondent) %>%
  extract(key,c("question","contact"),"reg ex") %>%
  spread(question,value)

但是事实证明,不同的长度和多个触点很难对齐。

解决方法

"contact"列中删除数字,然后可以使用pivot_longer

names(df) <- sub('(?<=contact)\\d+','',names(df),perl = TRUE)

tidyr::pivot_longer(df,cols = -Respondent,names_to = '.value')

#  Respondent contact question1 question2
#  <chr>      <chr>       <int>     <int>
#1 Tim        Bob             1         0
#2 Tim        Alan            0         1

数据

df <- structure(list(Respondent = "Tim",contact1 = "Bob",contact2 = "Alan",question1 = 1L,question2 = 0L,question1 = 0L,question2 = 1L),class = "data.frame",row.names = c(NA,-1L))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...