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