将行值转换为R中的列

时间:2016-03-01 02:47:46

标签: r

我有一个看起来像这样的数据表,这是一份关于人们正在服用的药物(编码为药物ID)的问卷调查结果:

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为#34; 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中这样做?我找不到适用于这样的多列的在线解决方案。

3 个答案:

答案 0 :(得分:2)

我们可以使用recast中的reshape2来融化然后转换数据框。感叹号!!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

答案 1 :(得分: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 :(得分: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