我正在寻找一个函数,它将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中执行此操作的最有效方法是什么?
答案 0 :(得分:1)
您可以像这样使用split
和paste
:
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="")))