比较两个列表的元素

时间:2015-08-03 20:26:39

标签: r

我有一个由2个变量组成的数据框。两者都只能取值1或0,因此只有4种可能的组合(组)。我想把这些团体分开。我的想法是使用expand.grid生成所有可能的组合,并将每个组合与数据帧进行比较。因为这必须做几次我想要使用lapply。出于这个原因,我创建了一个列表,其中数据帧作为唯一元素,第二个列表为4种可能的组合中的每一种组成了一个元素。

set.seed(1)
cbind(sample(1:2, 10, replace = TRUE),sample(1:2, 10, replace = TRUE))->pred
data.frame(pred)->pred
list(pred)->pred

expand.grid(1:2,1:2)->groups   
lapply(as.list(data.frame(t(groups))),t)->groups    

数据:

pred

   X1 X2
1   1  1
2   1  1
3   2  2
4   2  1
5   1  2
6   2  1
7   2  2
8   2  2
9   2  1
10  1  2

groups

$X1
      [,1] [,2]
[1,]    1    1

$X2
      [,1] [,2]
[1,]    2    1

$X3
     [,1] [,2]
[1,]    1    2

$X4
     [,1] [,2]
[1,]    2    2

这件事困扰着我:

pred[[1]]==groups[[1]]
       X1    X2
 [1,]  TRUE  TRUE
 [2,]  TRUE  TRUE
 [3,] FALSE FALSE
 [4,] FALSE  TRUE
 [5,]  TRUE FALSE
 [6,] FALSE  TRUE
 [7,] FALSE FALSE
 [8,] FALSE FALSE
 [9,] FALSE  TRUE
[10,]  TRUE FALSE

 pred[[1]]==groups[[2]]
         X1    X2
 [1,] FALSE FALSE
 [2,]  TRUE  TRUE
 [3,]  TRUE  TRUE
 [4,] FALSE  TRUE
 [5,] FALSE  TRUE
 [6,] FALSE  TRUE
 [7,]  TRUE  TRUE
 [8,] FALSE FALSE
 [9,]  TRUE FALSE
 [10,] TRUE FALSE

在第一种情况下它起作用,在第二种情况下它没有。代码有什么问题,是否可能有更好的解决方案来解决我的问题?

2 个答案:

答案 0 :(得分:4)

您无需将其转换为list;您可以直接从data.frame开始工作,如下所示:

这似乎是使用.GRP中的data.table的理想场所:

library(data.table)
setDT(pred)[,grp:=.GRP,by=.(X1,X2)][]
    X1 X2 grp
 1:  1  1   1
 2:  1  1   1
 3:  2  2   2
 4:  2  1   3
 5:  1  2   4
 6:  2  1   3
 7:  2  2   2
 8:  2  2   2
 9:  2  1   3
10:  1  2   4

答案 1 :(得分:2)

这是一个非data.table解决方案。

d$group <- factor(paste0(d$X1, d$X2), labels=1:4)
d
   X1 X2 group
1   1  2     2
2   2  2     4
3   1  1     1
4   1  2     2
5   1  2     2
6   1  2     2
7   2  1     3
8   2  2     4
9   1  1     1
10  2  2     4