2017-01-18 14 views
1

クロス検証のために、データフレームをリストに格納されたローリングチャンクに分割しようとしています。Rデータフレームを分割すると行名が保持されない

ここにありますが、私のコードです:

split_data <- function(data, window.size) { 
    windows.count = NROW(data) - window.size 
    res = vector(mode="character", windows.count) 
    print(head(data)) # (1) 

    for(d in 0:windows.count) { 
    res[d+1] <- data[(1+d):(window.size + d),,drop=FALSE] 
    print(head(res[[d+1]])) # (2) 
    } 

    return(res) 
} 

私がログアウトしたものを見てみると(1)私ははっきりと行名は自分のデータである見ることができます。スライスを実行してres[d+1](2)に格納すると、関連するデータフレームに行名がなくなったことを示します。

行の名前は、相互検証に非常に重要です。とにかくここで使うことはできますか?答えは常にスライシング操作にdrop=FALSEを追加するように思われますが、ここでは機能しません。

ありがとうございました!

EDIT:

でこれをしようとするデータセットを再作成するには:

label <- c("test1", "test2", "test3", "test4", "test5", "test6") 
dat <- c(1, 2, 3, 4, 5, 6) 
dats <- data.frame(dat) 
rownames(dats) <- label 

実行機能split_data(dats, 2)

は、所望の出力は、データフレームのリストです:

 dats 
test1  1 
test2  2 

     dats 
test2  2 
test3  3 

     dats 
test3  3 
test4  4 

     dats 
test4  4 
test5  5 

     dats 
test5  5 
test6  6 

私は実際のリストの出力を入れても、それを生成することはできません。これは、リストの各要素のリスト内に何が含まれるべきかを十分に示すものでなければなりません。

+0

開始データセットと出力を指定してください。 – Abdou

+0

@Abdou私が出力とサンプルデータセットとして望むものの最良の指標を与えました。さらに、列名ではなく行名を意味するように編集しました。 – rec

+0

また、 'lapply(1 :(nrow(dats)-wind + 1)、function(x)dats [x:(x + wind-1),, drop = FALSE])'割り当ておよびループコード。 – thelatemail

答えて

1

mode = "character"から "list"に変更する必要があります。あなたは文字ベクトルでdata.framesを格納しようとしていますが、あなたのアプローチのためにはリストが必要です。

また、res [d + 1]をres [[d + 1]]に変更します。 resがリストになったとすると、res [d + 1]はres [[d + 1]]がその内部に含まれるdata.frameを返すリストを返します。これは、違いのかなり良い概要を説明しています。ここhttp://adv-r.had.co.nz/Subsetting.html

は、あなたの変更機能、例です:

コメントで述べたものと同様に
split_data <- function(data, window.size) { 
    windows.count = NROW(data) - window.size 
    res = vector(mode="list", windows.count) 

    for(d in 0:windows.count) { 
    res[[d+1]] <- data[(1+d):(window.size + d),,drop=FALSE] 
    } 

    return(res) 
} 

label <- c("test1", "test2", "test3", "test4", "test5", "test6") 
dat <- c(1, 2, 3, 4, 5, 6) 
dats <- data.frame(dat) 
rownames(dats) <- label 

split_data(dats, 2) 

split_data(mtcars, 10) # example with mtcars dataset 

、これは私がこれを行うだろう一つの方法です。

split_data2 <- function(data, window.size) { 
    lapply(0:(nrow(dats) - window.size), 
     function(i) dats[(1 + i):(window.size + i), , drop = F]) 
} 

split_data2(dats, 2) 
+0

これはなぜ機能しますか?あなたはそれであなたの答えを更新できますか? – rec

+0

更新されました。 – Raad

関連する問題