2015-11-01 81 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