如何使用 R 处理(旋转?)社会调查原始数据?

How to use R for handling (pivoting?) social survey raw data?

我们经常在社会调查中提出规模问题;受访者表示他们同意我们的陈述(非常同意、同意、既不也不、不同意、非常不同意)。调查结果通常采用汇总格式,即对于每个问题(变量),答案都在一个列中提供,其中 5=非常同意,1=非常不同意等。

现在我们遇到了一种新的调查工具,其中针对一个问题将答案分成几列。例如,Q1_1 列 = 非常同意 Q1,Q1_5 列 = 非常不同意。因此,对于每个问题,我们收到 5 列答案,如果受访者回答“非常同意”,则 Q1_1 相关行标记为 1,其中 Q1_2 - Q1_5 相关行被标记为 0 .

任何人都可以分享 'aggregated' 新调查工具答案的解决方案,因此我们不会为每个问题设置 5 列,而是为每个问题设置一列,值为 1-5。

我是 R 的新手,我认为 R 会处理这个问题,而不必在 Excel 中手动更改。

尝试这种重塑方法,下次我们必须输入数据时,请遵循 @r2evans 的建议。这里的代码:

library(dplyr)
library(tidyr)
#Data
df <- data.frame(Respondent=paste0('Respondent',1:10),
                 Q6_1=c(1,0,1,1,1,1,0,0,0,1),
                 Q6_2=c(0,1,0,0,0,0,1,1,0,1),
                 Q6_3=rep(0,10),
                 Q6_4=c(rep(0,8),1,0),stringsAsFactors = F
                 )
#Code
new <- df %>% pivot_longer(-Respondent) %>%
  separate(name,c('variable','answer'),sep='_') %>%
  filter(value==1) %>%
  select(-value) %>%
  filter(!duplicated(Respondent)) %>%
  pivot_wider(names_from = variable,values_from=answer)

输出:

# A tibble: 10 x 2
   Respondent   Q6   
   <chr>        <chr>
 1 Respondent1  1    
 2 Respondent2  2    
 3 Respondent3  1    
 4 Respondent4  1    
 5 Respondent5  1    
 6 Respondent6  1    
 7 Respondent7  2    
 8 Respondent8  2    
 9 Respondent9  4    
10 Respondent10 1 

我只是好奇为什么你的数据在成员 10 的情况下有两个值 1。也许是打字错误或者这可能吗?

我们可以使用data.table方法

library(data.table)
dcast(unique(melt(setDT(df), id.var = 'Respondent')[,
  c('variable', 'answer') := tstrsplit(variable, '_', 
   type.convert = TRUE)][value == 1], by = "Respondent"), 
    Respondent  ~ variable, value.var = 'answer')

-输出

#      Respondent Q6
# 1:  Respondent1  1
# 2: Respondent10  1
# 3:  Respondent2  2
# 4:  Respondent3  1
# 5:  Respondent4  1
# 6:  Respondent5  1
# 7:  Respondent6  1
# 8:  Respondent7  2
# 9:  Respondent8  2
#10:  Respondent9  4

数据

df <- structure(list(Respondent = c("Respondent1", "Respondent2", "Respondent3", 
"Respondent4", "Respondent5", "Respondent6", "Respondent7", "Respondent8", 
"Respondent9", "Respondent10"), Q6_1 = c(1, 0, 1, 1, 1, 1, 0, 
0, 0, 1), Q6_2 = c(0, 1, 0, 0, 0, 0, 1, 1, 0, 1), Q6_3 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), Q6_4 = c(0, 0, 0, 0, 0, 0, 0, 0, 
1, 0)), class = "data.frame", row.names = c(NA, -10L))