R 如何根据ID'将数据框拆分为培训、验证和测试集;s
我需要将我的数据集随机拆分为训练集、验证集和测试集,如本文()所示,但它需要随机链接到拆分主题ID,而不是整个数据框 当应用回答这个问题的代码时,它会完全随机地分割我的数据帧,但我有堆叠的ID,需要它们保持在一起,否则一个主题数据将分布在不同的集合上 对不起,如果这听起来有点混乱的话。以下是我的数据来解释这个问题:R 如何根据ID'将数据框拆分为培训、验证和测试集;s,r,training-data,R,Training Data,我需要将我的数据集随机拆分为训练集、验证集和测试集,如本文()所示,但它需要随机链接到拆分主题ID,而不是整个数据框 当应用回答这个问题的代码时,它会完全随机地分割我的数据帧,但我有堆叠的ID,需要它们保持在一起,否则一个主题数据将分布在不同的集合上 对不起,如果这听起来有点混乱的话。以下是我的数据来解释这个问题: df <- c(Contact.ID, Date.Time, Age, Gender, Attendance) Contact.ID Date.Time
df <- c(Contact.ID, Date.Time, Age, Gender, Attendance)
Contact.ID Date.Time Age Gender Attendance
1 A 2012-07-06 18:54:48 37 Male 30
2 A 2012-07-06 20:50:18 37 Male 30
3 A 2012-08-14 20:18:44 37 Male 30
4 B 2012-03-15 16:58:15 27 Female 40
5 B 2012-04-18 10:57:02 27 Female 40
6 B 2012-04-18 17:31:22 27 Female 40
7 B 2012-04-18 18:37:00 27 Female 40
8 C 2013-10-22 17:46:07 40 Male 5
9 C 2013-10-27 11:21:00 40 Male 5
10 D 2012-07-28 14:48:33 20 Female 12
df您从中发布的代码为数据帧的每一行分配一个序列、验证或测试标签,然后根据每一行的标签进行拆分:
spec = c(train = .6, test = .2, validate = .2)
g = sample(cut(
seq(nrow(df)),
nrow(df)*cumsum(c(0,spec)),
labels = names(spec)
))
res = split(df, g)
set.seed(144)
spec = c(train = .6, test = .2, validate = .2)
g = sample(cut(
seq_along(unique(df$Contact.ID)),
length(unique(df$Contact.ID))*cumsum(c(0,spec)),
labels = names(spec)
))
(res = split(df, g[as.factor(df$Contact.ID)]))
# $train
# Contact.ID Date.Time Age Gender Attendance
# 1 A 2012-07-0618:54:48 37 Male 30
# 2 A 2012-07-0620:50:18 37 Male 30
# 3 A 2012-08-1420:18:44 37 Male 30
# 8 C 2013-10-2217:46:07 40 Male 5
# 9 C 2013-10-2711:21:00 40 Male 5
#
# $test
# Contact.ID Date.Time Age Gender Attendance
# 4 B 2012-03-1516:58:15 27 Female 40
# 5 B 2012-04-1810:57:02 27 Female 40
# 6 B 2012-04-1817:31:22 27 Female 40
# 7 B 2012-04-1818:37:00 27 Female 40
#
# $validate
# Contact.ID Date.Time Age Gender Attendance
# 10 D 2012-07-2814:48:33 20 Female 12
相反,您可以为ID因子变量的每个唯一级别分配一个标签,并根据分配给每行ID的标签进行拆分:
spec = c(train = .6, test = .2, validate = .2)
g = sample(cut(
seq(nrow(df)),
nrow(df)*cumsum(c(0,spec)),
labels = names(spec)
))
res = split(df, g)
set.seed(144)
spec = c(train = .6, test = .2, validate = .2)
g = sample(cut(
seq_along(unique(df$Contact.ID)),
length(unique(df$Contact.ID))*cumsum(c(0,spec)),
labels = names(spec)
))
(res = split(df, g[as.factor(df$Contact.ID)]))
# $train
# Contact.ID Date.Time Age Gender Attendance
# 1 A 2012-07-0618:54:48 37 Male 30
# 2 A 2012-07-0620:50:18 37 Male 30
# 3 A 2012-08-1420:18:44 37 Male 30
# 8 C 2013-10-2217:46:07 40 Male 5
# 9 C 2013-10-2711:21:00 40 Male 5
#
# $test
# Contact.ID Date.Time Age Gender Attendance
# 4 B 2012-03-1516:58:15 27 Female 40
# 5 B 2012-04-1810:57:02 27 Female 40
# 6 B 2012-04-1817:31:22 27 Female 40
# 7 B 2012-04-1818:37:00 27 Female 40
#
# $validate
# Contact.ID Date.Time Age Gender Attendance
# 10 D 2012-07-2814:48:33 20 Female 12
请注意,这改变了分割比例的解释:分配给训练集的60%现在是唯一主题ID的60%,而不是行的60%。Hey:)非常感谢您的回复!我了解您的方法以及它应该如何工作,但它对我的数据不起作用。我有大约13000个ID,当我运行你的代码时,它会根据spec
分割我的280000个观察值,但不同的集合仍然每个都有13000个ID,因此它仍然不会根据spec
分割我的ID。你知道我该怎么改变吗?嘿,我想我已经解决了:我曾经用我的ID作为因子变量,但我现在试着把它们改成数字,我想这是可行的。这个问题有意义吗?@Fee我在这里发布的代码应该适用于ID字段的任何数据类型。如果您可以共享一些实际数据,例如,dput(head(df))
的输出,如果您在为数据工作时遇到问题,这将非常有用。嘿,是的,我在一个小样本集上尝试了它,它确实起了作用。区别在于,当ID是一个因子时,它注册所有级别,而如果它是一个整数,它只注册当前ID。因此,是的,代码可以在任何一种变量类型上工作,但当用作因子时,它只是有点混乱。非常感谢你的帮助!:)@是的,这是有道理的。