如何清理和重新编码检查R调查数据中的所有应用响应?

如何清理和重新编码检查R调查数据中的所有应用响应?,r,survey,data-cleaning,R,Survey,Data Cleaning,我得到了一些调查数据,其中有一些多重回答问题,如: HS18为什么在南非很难获得医疗护理?选择所有适用的选项 1 Too expensive 2 No transportation to the hospital/clinic 3 Hospital/clinic is too far away 4 Hospital/clinic staff do not speak my language 5 Hospital/clinic staff do not like foreign

我得到了一些调查数据,其中有一些多重回答问题,如:

HS18为什么在南非很难获得医疗护理?选择所有适用的选项

1   Too expensive
2   No transportation to the hospital/clinic
3   Hospital/clinic is too far away
4   Hospital/clinic staff do not speak my language
5   Hospital/clinic staff do not like foreigners
6   Wait time too long
7   Cannot take time off of work
8   None of these. I have no problem accessing medical care
使用逗号输入多个响应并记录为不同级别,即:

独一无二的18 [1] 888 1 6 4 5 8 2 3,5 4,6 3,6 3,4 3 [13] 4,5,6 7 999 4,5 2,6 4,8 7,8 1,6 1,2,3 5,7,8 4,5,6,7 1,4 [25] 0 5,6,7 5,6 2,3 1,4,6,7 1,4,5 30个等级:01,2,31,41,4,51,4,6,71,622,32,633,435,644,545,646,746,8。。。999

这既是一个数据清理协议问题,也是一个R问题……我在清理,但不是分析,所以当我把它传回来时,一切都需要透明和用户友好…PI不使用R。基本上,我想把倍数分成几个级别,重新命名它们,同时将它们作为一个单独的观察值放在一起…不知道如何做,或者即使这是正确的方法

你一般如何处理这个问题?是否有一种优雅的方法来处理这些数据,以进行STATA简单描述、回归、优势比分析


谢谢大家

我分析此类多选问题的最佳思路是将可能的答案转换为指标变量:在本例中,将所有可能的答案1到8,并创建名为HS18.1、HS18.2等的数据列。您可以选择在列名中包含更多内容,但这完全是您和PI之间的事

此处的示例数据似乎包含非法数据:选项中未列出0、888和999。这些可能包括DK/NR响应,但我不能确定。因此:

在将0+长度列表转换为指示符变量之前,您的数据清理应该处理这些异常

我下面的代码任意忽略了这一事实,您将丢失数据。这显然不是一件好事™ 从长远来看。更可靠的检查是必要的,并不困难。我添加了另一列,表示丢失了一些东西

守则:

ss <- '888 1 6 4 5 8 2 3,5 4,6 3,6 3,4 3 4,5,6 7 999 4,5 2,6 4,8 7,8 1,6 1,2,3 5,7,8 4,5,6,7 1,4 0 5,6,7 5,6 2,3 1,4,6,7 1,4,5'
dat <- lapply(strsplit(ss, ' '), strsplit, ',')[[1]]
lvls <- as.character(1:8)
## lvls <- sort(unique(unlist(dat))) # alternative method
ret <- structure(lapply(lvls, function(lvl) sapply(dat, function(xx) lvl %in% xx)),
                 .Names = paste0('HS18.', lvls),
                 row.names = c(NA, -length(dat)), class = 'data.frame')
ret$HS18.other <- sapply(dat, function(xx) !all(xx %in% lvls))
ret <- 1 * ret ## convert from TRUE/FALSE to 1/0
head(1 * ret)
##   HS18.1 HS18.2 HS18.3 HS18.4 HS18.5 HS18.6 HS18.7 HS18.8 HS18.other
## 1      0      0      0      0      0      0      0      0          1
## 2      1      0      0      0      0      0      0      0          0
## 3      0      0      0      0      0      1      0      0          0
## 4      0      0      0      1      0      0      0      0          0
## 5      0      0      0      0      1      0      0      0          0
## 6      0      0      0      0      0      0      0      1          0
结果data.frame可以与您拥有的任何其他数据进行cbinded甚至矩阵化


我使用1和0而不是TRUE和FALSE,因为您说过PI将不使用R;可以很容易地将其更改为字符串或对他们更有意义的内容。

首先,我推荐使用splitstackshape函数中的cSplit。但我不知道你想要的输出会是什么样子。分裂有一个长而宽的背景。