2015-11-01 48 views
0

我有一个506行的数据框。我正在尝试使用线性回归模型来实现k-fold交叉验证。这里是我的CSV的链接。将整数序列添加到约500行的数据框中

我在准备使用Leave-One-Out模型的火车和测试数据框架。 我收到以下作为输入:

df - data frame with 506 records 
k - fold cross-validation (example: 10) 

这是我做的准备测试和训练数据帧:

df <- c(1:506) # This is just for representation purposes 
df <- cbind(idx, df) 
for(ii in 1:k) { 
    train <- subset.data.frame(df, df[,1] == ii) 
    test <- subset.data.frame(df, df[,1] != ii) 
    # Further processing with train and test datasets 
} 

这给了我5060个条目的DF。

idx df 
1 1 1 
2 1 2 
3 1 3 
4 1 4 
5 1 5 
6 1 6 
7 1 7 
8 1 8 
9 1 9 
10 1 10 
11 1 11 
... 
506 1 506 
507 2 1 
508 2 2 

不过,我要的是数据帧中被划分到k等份:

idx df 
1 1 1 
2 1 2 
3 1 3 
4 1 4 
5 1 5 
6 1 6 
... 
48 1 48 
49 1 49 
50 1 50 
51 1 51 
52 2 52 
53 2 53 
54 2 54 
... 
504 10 504 
505 10 505 
506 10 506 

我是比较新的R.所以如果可能的话,请使用基础包,所以我明白我做错了什么?

+0

当涉及到运行的简历,我倾向于创建一个索引,使用'split',并使用此索引来对数据进行子集化。举例来说,..'K < - 10; s < - split(sample(nrow(yourdat)),seq_len(K)); out < - lapply(s,function(ii){ train < - yourdat [-ii,]; test < - yourdat [ii,]; ...更多命令})' – user20650

回答

0

如果我理解正确,问题出在您的idx列。以下是如何创建一个序列,其中的数据不会完全适合存储桶。你有506个观测值,你正在试图适应10个桶。一些桶将包含比其他桶更多的数据。

df <- 1:506 
idx <-ceiling(seq_along(df)/(length(df)/10)) 
df <- cbind(idx, df) 

在你的循环中,我使用subset因为df不是data.frame。无论如何,R通常会找出它处理的数据类型。

​​

UPDATE

随着加载csv数据data.frame

df <-read.csv("C:/temp/house_with_missing.csv",stringsAsFactors = FALSE)     
idx <-ceiling(seq_along(1:nrow(df))/(nrow(df)/10))     
df <- cbind(idx, df)  
+0

这适用于df < - 1 :506。但是,当我使用我的df时,它会给出以下错误: data.frame中的错误(...,check.names = FALSE): 参数意味着不同的行数:9,506 – AngryPanda

+0

这是行得通吗? 'idx <-ceiling(seq_along(1:506)/(506/10))' –

+0

我已经添加了一个URL到我的csv。希望能帮助到你! – AngryPanda