R将dataframe列连接到部分匹配的网格

时间:2017-03-15 17:19:46

标签: r match

我有一个数据框对象,其中变量的组合由1表示,但是稀疏填充,因为我没有映射出所有组合。

e.g。

The time is {{time}}  <br>
The value of PI is {{PI}}

......缺少潜在的组合[101]和[111]

由此,我想扩展A,B和C的所有组合,将结果存在于组合存在的位置,如果不存在,则将结果填充为零。

e.g。

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

我恐怕我真的不知道如何在功能上做到这一点。我查看了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

,其中n = 3给出

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

它几乎给了我我追求的网格,但我现在还不清楚如何将我的“结果”值加入到这个网格中,特别是在n很大的情况下(比如60或70个变量)。

感激不尽的任何帮助!

1 个答案:

答案 0 :(得分:2)

Table::where('id', 1)->get(['name','surname']);

<强> 编辑:

不确定是否应该单独回答,但这是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

如果您想避免键入所有60或70列名称:

library(tidyr)

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