我有一个包含两个结果变量case1和case2的数据集。 Case1有4个级别,而case2有50个级别(case2中的级别可能会增加)。我想为火车和测试创建数据分区,以保持两种情况下的比率。 case1和case2的实际数据都是不平衡的。例如,
library(caret)
set.seed(123)
matris=matrix(rnorm(10),1000,20)
case1 <- as.factor(ceiling(runif(1000, 0, 4)))
case2 <- as.factor(ceiling(runif(1000, 0, 50)))
df <- as.data.frame(matris)
df$case1 <- case1
df$case2 <- case2
split1 <- createDataPartition(df$case1, p=0.2)[[1]]
train1 <- df[-split1,]
test1 <- df[split1,]
length(split1)
201
split2 <- createDataPartition(df$case2, p=0.2)[[1]]
train2 <- df[-split2,]
test2 <- df[split2,]
length(split2)
220
如果我进行单独拆分,我会得到不同的数据帧长度。如果我根据case2进行一次拆分(一次有更多类),我就失去了case1的类的比例。
我将分别预测这两个案例,但最后我的准确性将通过两个案例的完全匹配来给出(例如,ix =(pred1 == case1&amp; pred2 == case2),所以我需要数组大小相同。
有没有聪明的方法来做到这一点?
谢谢!
答案 0 :(得分:3)
如果我理解正确(我不保证),我可以提供以下方法:
按案例1和案例2分组并获取组索引
library(tidyverse)
df %>%
select(case1, case2) %>%
group_by(case1, case2) %>%
group_indices() -> indeces
在创建数据分区中使用这些indeces作为结果变量:
split1 <- createDataPartition(as.factor(indeces), p=0.2)[[1]]
检查是否满意:
table(df[split1,22])
#output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
5 6 5 8 5 5 6 6 4 6 6 6 6 6 5 5 5 4 4 7 5 6 5 6 7 5 5 8 6 7 6 6 7
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
4 5 6 6 6 5 5 6 5 6 6 5 4 5 6 4 6
table(df[-split1,22])
#output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
15 19 13 18 12 13 16 15 8 13 13 15 21 14 11 13 12 9 12 20 17 15 16 19 16 11 14 21 13 20 18 13 16
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
9 6 12 19 14 10 16 19 17 17 16 14 4 15 14 9 19
table(df[split1,21])
#output
1 2 3 4
71 70 71 67
table(df[-split1,21])
1 2 3 4
176 193 174 178