2017-03-15 79 views
0

我有一個數據框對象,其中變量的組合表示爲1,但是由於沒有繪製出所有組合,所以變量稀疏。R將數據幀列連接到部分匹配的網格

例如

A B C Outcome 
1 0 0 700 
0 1 0 900 
0 0 1 450 
1 1 0 280 
0 1 1 100 

...這是缺少潛在組合[101]和[111]

由此,我想擴大了A,B和C的所有組合,取結果價值組合存在的地方,如果不存在,則用零填充結果。

例如

A B C Outcome 
1 0 0 700 
1 1 0 280 
1 0 1 0   <- new row 
1 1 1 0   <- new row 
0 1 0 900 
0 1 1 100 
0 0 1 450 

恐怕我真的不知道如何在功能上做到這一點。我看了一下expand.grid() - 例如下面也採用plyr

expand.grid(rlply(n, c(0,1))) 

其中n = 3時給出

Var1 Var2 Var3 
1 0 0 0 
2 1 0 0 
3 0 1 0 
4 1 1 0 
5 0 0 1 
6 1 0 1 
7 0 1 1 
8 1 1 1 

這幾乎讓我的網,我後,但我現在還不清楚如何將這個「結果」值加入到這個網格中,特別是當n很大時(比如60或70個變量)。

任何幫助感激地收到!

回答

2
df <- read.table(text = 
"A B C Outcome 
1 0 0 700 
0 1 0 900 
0 0 1 450 
1 1 0 280 
0 1 1 100", 
header = TRUE) 

res <- 
    merge(
    x = do.call(what = "expand.grid", lapply(head(as.list(df), - 1), unique)), 
    y = df, 
    all.x = TRUE 
) 
res$Outcome[is.na(res$Outcome)] <- 0 
res 
# A B C Outcome 
# 1 0 0 0  0 
# 2 0 0 1  450 
# 3 0 1 0  900 
# 4 0 1 1  100 
# 5 1 0 0  700 
# 6 1 0 1  0 
# 7 1 1 0  280 
# 8 1 1 1  0 

編輯:

不能確定它是否應該在一個單獨的答案,但這裏是與tidyr包一個更優雅的方式:

library(tidyr) 

complete(df, A, B, C, fill = list(Outcome = 0)) 

如果你想避免輸入全部60或70列名稱:

complete_(df, cols = setdiff(names(df), "Outcome"), fill = list(Outcome = 0))