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