查找数据帧的所有可能子集

时间:2018-01-10 14:47:32

标签: r

我正在寻找一个函数,它将data.frame的列作为引用,并查找与其他变量级别相关的所有子集。例如,让z为具有4列a,b,c,d的数据框,例如,每列有2个级别。让a作为参考。然后z就像

z$a : TRUE FALSE
z$b : TRUE FALSE
z$c : TRUE FALSE
z$d : TRUE FALSE

然后我需要的是一个列表,元素是组合名称,如

aTRUEbTRUEcTRUEdTR UE :subset of the dataframe 
aTRUEbFALSEcTRUEdTRUE : subset
...

这是一个例子,

set.seed(123)
z=matrix(sample(c(TRUE,FALSE),size = 100,replace = TRUE),ncol=4)
colnames(z) = letters[1:4]
z=as.data.frame(z)


output= list(
    'bTUEcTRUEdFALSE' = subset(z,b==TRUE & c==TRUE & d==FALSE),
    'bTRUEcTRUEdTRUE' = subset(z,b==TRUE & c==TRUE & d==TRUE),
    'bTRUEcFALSEdFALSE' = subset(z,b==TRUE & c==FALSE & d==FALSE),
    'bTRUEcFALSEdTRUE' = subset(z,b==TRUE & c==FALSE & d==TRUE)
    # and so on ...
)
output
$bTUEcTRUEdFALSE
       a    b    c     d
13 FALSE TRUE TRUE FALSE
14 FALSE TRUE TRUE FALSE

$bTRUEcTRUEdTRUE
       a    b    c    d
4  FALSE TRUE TRUE TRUE
10  TRUE TRUE TRUE TRUE
16 FALSE TRUE TRUE TRUE
20 FALSE TRUE TRUE TRUE
24 FALSE TRUE TRUE TRUE

$bTRUEcFALSEdFALSE
       a    b     c     d
17  TRUE TRUE FALSE FALSE
19  TRUE TRUE FALSE FALSE
22 FALSE TRUE FALSE FALSE

$bTRUEcFALSEdTRUE
       a    b     c    d
5  FALSE TRUE FALSE TRUE
11 FALSE TRUE FALSE TRUE
15  TRUE TRUE FALSE TRUE
18  TRUE TRUE FALSE TRUE
21 FALSE TRUE FALSE TRUE
23 FALSE TRUE FALSE TRUE

但是,该示例存在问题。首先,我不知道变量的数量(在这种情况下是4(a到d)。其次,必须从数据中捕获变量的名称(简单来说,我不能使用子集,因为我不知道变量名称在条件中(a ==可以是任何东西==)

在R中执行此操作的最有效方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以像这样使用splitpaste

split(z, paste(z$b, z$c, z$d))

但问题的棘手部分是如何以编程方式组合第2列中的变量:结束时事先不知道列数,名称或值。我们可以使用下面的函数在第2列中按行粘贴值:结束

apply(df, 1, function(i) paste(i[-1], collapse=""))

现在与split

结合使用
split(z, apply(z, 1, function(i) paste(i[-1], collapse="")))