问题描述
我正在处理一些稍显尴尬的调查数据。调查软件的输出格式为:
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))