我有一个由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
在第一种情况下它起作用,在第二种情况下它没有。代码有什么问题,是否可能有更好的解决方案来解决我的问题?
答案 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