我正在尝试使用R中的循环构建多个数据集以进行交叉验证。我有以下代码:
for (i in 1:10) {
as.data.frame(assign(paste("c",i,sep="_"),dd[((100*i)-99):(100*i),]))
as.data.frame(assign(paste("t",i,sep="_"),subset(dd,-c_[[i]])))
}
因此,循环的第一行有效并正确地创建了我的控制集,但是我似乎无法弄清楚如何将训练集创建为我的初始数据的子集,以排除控制集中的行。
基于使用新创建的c_i数据帧的方法和基于从第一行重复条件的方法都似乎无效。
很抱歉,这似乎是一个简单的问题,我对R和一般编程还是很陌生。
谢谢您的帮助! :)
答案 0 :(得分:0)
重新考虑构建单独的数据框以淹没您的全局环境,并使用assign
这样做。而是建立两个数据框列表以容纳结构相似的10个数据框。对于控制/训练拆分,请在组变量上使用split
,反之,请使用by
。
# RESET ROW NAMES IF NOT NEEDED
row.names(dd) <- NULL
# CREATE A GROUP COLUMN (MULTIPLES OF 100: df_0, df_100 ... df_900)
dd$grp <- paste0("df_", as.integer((as.integer(row.names(dd))-1) / 100) * 100)
# NAMED LIST OF df_0, df_100 ... df_900 (EACH NROWS = 100)
control_dflist <- split(dd, dd$grp) # OR by(dd, dd$grp, identity)
# NAMED LIST OF df_0, df_100 ... df_900 (EACH NROWS = 900)
training_dflist <- by(dd, dd$grp, function(sub) subset(dd, grp!= max(sub$grp)))
请注意:如果数据帧位于命名列表中而不是单独的对象中,则不会丢失数据帧的功能。
head(control_dflist$df_0) # 1ST CONTROL DF
summary(control_dflist$df_100) # 2ND CONTROL DF
tail(control_dflist$df_200) # 3RD CONTROL DF
要演示随机数据:
set.seed(6222018)
dd <- data.frame(
ID = replicate(1000, sample(seq(15), 1, replace=TRUE)),
TOOL = replicate(1000, sample(c("julia","r","pandas","spss","stata","sas"), 1, replace=TRUE)),
NUM = rnorm(1000)*100
)
control_dflist <- by(dd, dd$grp, identity)
training_dflist <- by(dd, dd$grp, function(sub) subset(dd, grp!= max(sub$grp)))
输出 (显示编号和命名的引用;保留行名称以供说明)
head(control_dflist[[1]])
# ID TOOL NUM grp
# 1 4 sas 80.44873 df_0
# 2 5 r -204.50714 df_0
# 3 2 spss -111.54602 df_0
# 4 8 julia -145.48614 df_0
# 5 2 sas 103.82625 df_0
# 6 6 spss -58.82708 df_0
head(training_dflist[[1]])
# ID TOOL NUM grp
# 101 10 sas -19.82463 df_100
# 102 4 spss 78.58277 df_100
# 103 2 stata 26.53858 df_100
# 104 13 sas 190.65434 df_100
# 105 1 r 36.96777 df_100
# 106 12 r 133.77021 df_100
tail(control_dflist$df_0)
# ID TOOL NUM grp
# 95 3 stata 13.446515 df_0
# 96 3 spss 171.488068 df_0
# 97 11 sas 48.573506 df_0
# 98 10 r -132.522866 df_0
# 99 12 stata -155.558407 df_0
# 100 2 stata 7.590873 df_0
tail(training_dflist$df_0)
# ID TOOL NUM grp
# 995 3 spss 92.613934 df_900
# 996 11 spss 13.389638 df_900
# 997 15 julia -147.108295 df_900
# 998 3 stata 91.032385 df_900
# 999 4 sas -21.505796 df_900
# 1000 15 sas -9.771332 df_900