2016-01-14 71 views
1

假設我有以下data.frame:model.matrix與賦值

df=data.frame(cat=c("a","b","c"),y=c(1,2,3)) 

以類別的model.matrix(貓),將它們轉換爲虛擬變量如下:

model.matrix(~0+cat,df) 


cata catb catc 
1 1 0 0 
2 0 1 0 
3 0 0 1 
attr(,"assign") 
[1] 1 1 1 
attr(,"contrasts") 
attr(,"contrasts")$cat 
[1] "contr.treatment" 

然而,我希望將這些虛擬變量分配給df $ y中的值。我能想到的一個可能的解決方案是用y乘以行。

但是,我猜這有更好的目的建立功能?

因此,基本上,將虛擬變量轉換爲給定向量的最有效方法是什麼?

回答

3

可能是我們可以嘗試

library(reshape2) 
acast(df, cat~y, value.var="y", fill=0) 
# 1 2 3 
#a 1 0 0 
#b 0 2 0 
#c 0 0 3 

或者使用model.matrix

model.matrix(~0 + cat, df) *df$y 
+0

這_would_似乎是有目共睹的答案。人們不知道。 –

+0

第一種方法會被認爲是更有效的方法。特別是考慮到沒有乘法運算? –

+0

@Sachin_ruk如果您使用'library(data.table)'中的'dcast',它會更有效率。但是,您可以使用'library(microbenchmark)'在一個更大的數據集上進行基準測試,以查看哪一個是有效的。 – akrun