R 比较两个列表的元素

R 比较两个列表的元素,r,R,我有一个由2个变量组成的数据框架。两者都只能取值1或0,因此只有4种可能的组合(组)。我想把各组分开。我的想法是使用expand.grid生成所有可能的组合,并将每个组合与数据帧进行比较。因为这必须做几次,我想用lappy。出于这个原因,我创建了一个列表,其中dataframe是其唯一的元素,第二个列表中的4种可能组合各有一个元素 set.seed(1) cbind(sample(1:2, 10, replace = TRUE),sample(1:2, 10, replace = TRUE))-

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

在第一种情况下,它起作用,而在第二种情况下,它不起作用。代码有什么问题,有没有更好的解决方案?

您不需要将其转换为
列表;您可以直接从
data.frame
工作,如下所示:

这似乎是从
数据中使用
.GRP
的最佳位置。表

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

您不需要将其转换为
列表
;您可以直接从
data.frame
工作,如下所示:

这似乎是从
数据中使用
.GRP
的最佳位置。表

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

这是一个非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

d$group这是一个非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

d$group我想它来自
list(pred)->pred
code。不知道是怎么回事。OP中有点不一致,他说他有一个
data.frame
,但在那里声明它是一个
列表
。@akrun可以帮助你说出你得到了什么错误,你需要
setDT(pred[[1]])
,因为OP把数据框放在了一个列表中@SeñorO我还看到了一个错误:“趣味中的错误(X[[I]],…):无效列:它有维度。”是的。奇怪的是,无论是
setDT(pred)
还是
data.table(pred)
都不起作用,考虑到
data.frame(pred)
,框架(pred)
做了你想的事情。另一种选择是
rbindlist(pred)
自动将
data.table
设置为结果的类。我认为它来自
list(pred)->pred
代码。不知道是怎么回事。OP中有点不一致,他说他有一个
data.frame
,但在那里声明它是一个
列表
。@akrun可以帮助你说出你得到了什么错误,你需要
setDT(pred[[1]])
,因为OP把数据框放在了一个列表中@SeñorO我还看到了一个错误:“趣味中的错误(X[[I]],…):无效列:它有维度。”是的。奇怪的是,无论是
setDT(pred)
还是
data.table(pred)
都不起作用,考虑到
data.frame(pred)
会按照您的想法运行。另一种选择是
rbindlist(pred)
自动将
数据.表格
设置为结果的类别。您想要的输出是什么?下面答案中的输出就是我想要的。然而,我仍然想知道为什么“pred[[1]]==groups[[2]]”会产生如此奇怪的结果。因为我不知怎么搞不懂
pred[[1]]==groups[[1]]
pred[[1]]
(1,1)的第一行与
组[[1]]
(1,1)进行比较。结果是(真的,真的)。这适用于所有行。但是,
pred[[1]]==groups[[2]]
正在做其他事情。将
pred[[1]]
(1,1)的第一行与
组[[2]]
(2,1)进行比较,结果是(TRUE,TRUE)而不是(FALSE,TRUE)。是的,它看起来像
pred[[1]]
未列出,并且每两个值都与一直循环使用的
2:1
进行比较。您想要的输出是什么?答案中下面的输出就是我想要的。然而,我仍然想知道为什么“pred[[1]]==groups[[2]]”会产生如此奇怪的结果。因为我不知怎么搞不懂
pred[[1]]==groups[[1]]
pred[[1]]
(1,1)的第一行与
组[[1]]
(1,1)进行比较。结果是(真的,真的)。这适用于所有行。但是,
pred[[1]]==groups[[2]]
正在做其他事情。将
pred[[1]]
(1,1)的第一行与
组[[2]]
(2,1)进行比较,得到的是(真,真)而不是(假,真)。是的,似乎
pred[[1]]
未列出,并且将每两个值与一直循环使用的
2:1
进行比较