2017-03-15 4 views
0

変数の組み合わせが1で表されるデータフレームオブジェクトがありますが、すべての組み合わせがマップされているわけではありません。Rデータフレーム列を部分的に一致するグリッドに結合します。

このことから、潜在的な組み合わせ[101]不足している

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

...と[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()を見て持っていた - 例えば、以下のもの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 

を与えるplyrパッケージ

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

を使用してしかし、私は今、このグリッド、特にnが大きい(例えば60または70の変数) "Outcome"値をこのグリッドに結合する方法が明確ではない。

感謝の気持ちで助けてください!

答えて

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 

編集:

library(tidyr) 

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

したい場合は:それは別の答えに行くが、ここではtidyrパッケージと、よりエレガントな方法であるべきかどうか

わかりません60または70列の名前をすべて入力しないようにします。

complete_(df, cols = setdiff(names(df), "Outcome"), fill = list(Outcome = 0)) 
関連する問題