2016-03-01 90 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