我有一个看起来像这样的数据表,这是一份关于人们正在服用的药物(编码为药物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中这样做?我找不到适用于这样的多列的在线解决方案。
答案 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