2016-03-01 62 views
2

我有一个看起来像这样,从约正在服用什么药物(编码为药品ID)人问卷引起的数据表:转换行值到列中的R

ID Drug1 Drug2 Drug3 Drug4 
1 45 NA NA NA 
2 NA NA NA NA 
3 23 45 NA NA 
4 23 NA NA NA 
5 57 45 23 NA 

在换句话说,第一人正在服用ID为“45”的药物第二人没有服用任何药物。第三人在吸毒,23和45

我想这转换成以下矩阵:

ID 23  45  57 
1 FALSE TRUE FALSE 
2 FALSE FALSE FALSE 
3 TRUE TRUE FALSE 
4 TRUE FALSE FALSE 
5 TRUE TRUE TRUE 

我怎样才能做到这一点R中?我找不到适用于多列的解决方案。

回答

2

无需包:

with(cbind(dat[1], stack(dat[-1])), table(ID, values) > 0) 

# values 
#ID  23 45 57 
# 1 FALSE TRUE FALSE 
# 2 FALSE FALSE FALSE 
# 3 TRUE TRUE FALSE 
# 4 TRUE FALSE FALSE 
# 5 TRUE TRUE TRUE 
2

我们可以使用reshape2中的recast来融化然后投射数据帧。惊叹号!!很短的as.logical

library(reshape2) 
r <- recast(df, id.var="ID", ID~value) 
cbind(r[1], !!r[,-c(1,ncol(r))]) 
# ID 23 45 57 
# 1 1 FALSE TRUE FALSE 
# 2 2 FALSE FALSE FALSE 
# 3 3 TRUE TRUE FALSE 
# 4 4 TRUE FALSE FALSE 
# 5 5 TRUE TRUE TRUE 
+0

谢谢!但是,我收到以下消息:缺少聚合函数:默认为长度。警告消息:测量变量中的属性不相同;他们将被丢弃 –

+0

这是给你提供信息的功能。不是问题。你可以添加'value.var =“value”',但是它说的是它为你选择了列。 –

1

我们可以使用mtabulate

library(qdapTools) 
res <- cbind(df1[1],!!mtabulate(as.data.frame(t(df1[-1])))) 
row.names(res) <- NULL 
res 
# ID 23 45 57 
#1 1 FALSE TRUE FALSE 
#2 2 FALSE FALSE FALSE 
#3 3 TRUE TRUE FALSE 
#4 4 TRUE FALSE FALSE 
#5 5 TRUE TRUE TRUE