我的调查数据包含一些多重回答问题:
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
其中使用逗号输入多个回复并记录为不同级别,即:
独特(HS18) [1] 888 1 6 4 5 8 2 3,5 4,4 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级:0 1 1,2,3 1,4 1,4,5 1,4,6,7 1,6 2 2,3 2,6 3 3,4 3,5 3,6 4 4,5 4 ,5,6 4,5,6,7 4,6 4,8 ... 999
这与R问题一样是一个数据清理协议问题......我正在进行清理,但不进行分析,因此当我将其传回时,一切都需要透明且用户友好... PI不使用R.基本上我想将倍数分成几个级别并重新命名,同时将它们保持在一起作为单个观察...不确定如何做到这一点,或者即使它是正确的方法
您如何处理这个问题?是否有一种优雅的方法来处理这个以便在STATA中进行分析(简单描述,回归,比值比)?
谢谢大家!
答案 0 :(得分:3)
我最好分析这样的多选问题是将可能的答案转换为指标变量:获取所有可能的答案(本例中为1到8)并创建名为HS18.1
的数据列,{ {1}}等(您可以选择在列名中包含更多内容,但这完全包含在您和PI之间。)
此处的示例数据看起来包含不合法的数据:HS18.2
,0
和888
未在选项中列出。它们可能/可能包括DK / NR响应,但我无法确定。就这样:
在将0+长度列表转换为指标变量的步骤之前,您的数据清理应该正在处理这些异常。
我的代码下面任意忽略了这个事实,你将丢失数据。这显然不是" A Good Thing™"长期来说。更有力的检查是有保证的(并不困难)。 (我已添加999
列以表明丢失了某些内容。)
代码:
other
生成的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
{甚至cbind
到您拥有的任何其他数据。
(我使用matrix
和1
代替0
和TRUE
因为您说PI不会使用R;这可以很容易地更改为字符串或者对他们更有意义的东西。)