2014-10-06 48 views
5

我想使用公式提取數據幀,該公式指定要選擇哪些列,並且中的某些跨越。使用model.frame和公式提取數據幀

我知道model.frame函數。然而,它並沒有給我的交叉旁白:

例如:

df <- data.frame(x = c(1,2,3,4), y = c(2,3,4,7), z = c(5,6, 9, 1)) 
f <- formula('z~x*y') 
model.frame(f, df) 

輸出:

> df 
    x y z 
1 1 2 5 
2 2 3 6 
3 3 4 9 
4 4 7 1 
> f <- formula('z~x*y') 
> model.frame(f, df) 
    z x y 
1 5 1 2 
2 6 2 3 
3 9 3 4 
4 1 4 7 

我希望得到:

z x y x*y 
1 5 1 2 2 
2 6 2 3 6 
3 9 3 4 12 
4 1 4 7 28 

有一個包,可以實現這個功能? (這將是完美的,如果我能得到的矩陣來作爲稀疏矩陣因爲交叉列將是非常稀少)

回答

4

您可以使用model.matrix

> model.matrix(f, df) 
    (Intercept) x y x:y 
1   1 1 2 2 
2   1 2 3 6 
3   1 3 4 12 
4   1 4 7 28 
attr(,"assign") 
[1] 0 1 2 3 

如果你想保存的結果作爲稀疏矩陣,您可以使用Matrix包:

> mat <- model.matrix(f, df) 
> library(Matrix) 
> Matrix(mat, sparse = TRUE) 
4 x 4 sparse Matrix of class "dgCMatrix" 
    (Intercept) x y x:y 
1   1 1 2 2 
2   1 2 3 6 
3   1 3 4 12 
4   1 4 7 28 
+1

您可以使用Matrix包中的sparse.model.matrix()。像這樣:'sparse.model.matrix(f,df)' – 2014-10-06 17:58:00

+0

@FlavioBarros好主意,我不知道這個功能。 – 2014-10-06 18:03:20