1

したがって、私の目標は、csv ファイル、出力パス、および任意の数の分割サイズ (行数による) を入力として受け取り、データをランダム化して適切なファイルに分割する関数を作成することです。事前に分割サイズがわかっている場合は、これを手動で簡単に実行できますが、さまざまな分割サイズを処理する自動化された機能が必要です。簡単に思えますが、ここに私が書いたものがあります:

randomizer = function(startFile, endPath, ...){ ##where ... are the user-defined split sizes

           vec = unlist(list(...))

           n_files = length(vec)

           values = read.csv(startFile, stringsAsFactors = FALSE)

           values_rand = as.data.frame(values[sample(nrow(values)),])

           for(i in 1:n_files){
              if(nrow(values_rand)!=0 & !is.null(nrow(values_rand))){
              assign(paste('group', i , sep=''), values_rand[1:vec[i], ]);
              values_rand = as.data.frame(values_rand[(vec[i]+1):nrow(values_rand), ], stringsAsFactors = FALSE)
              ## (A) write.csv fn here?
                 } else {
               print("something went wrong")
                }
            }
## (B) write.csv fn here?
}
  }

write.csv(x= paste('group', i, sep=''), file= paste(endPath, '/group', i, '.csv', sep=''), row.names=FALSE エラーが発生したり、探しているランダム化されたデータフレームのチャンクではなく、文字通り文字列「group1」をcsvに書き込んだりするなど、その場で何かをしようとすると(A) 。これは、本物のプログラミングの問題ではなく、Rのセマンティクスに直面しているように見えるため、非常に混乱しています..事前に助けてくれてありがとう。

4

1 に答える 1

1

あなたは確かにここでコーナーに自分自身をプログラムしました。初心者、特に他のプログラミング言語から R にやってくる初心者が最終的に行き着くのは一般的なコーナーです。

の使用はassign大きな赤い旗です。少なくともその言語を使い始めたばかりのときに、自分がその機能に手を伸ばしていると感じたら、立ち止まってもう一度考え直してください。問題へのアプローチが完全に間違っている可能性が高く、再考する必要があります。

これは、あなたが説明したものの私の(完全にテストされていない)バージョンであり、いくつかのコメントで注釈が付けられています:

split_file <- function(startFile,endPath,sizes){
    #There's no need to use "..." for the partition sizes.
    # A simple vector of values is much simpler

    values <- read.csv(startFile,stringsAsFactors = FALSE)

    if (sum(sizes) != nrow(values)){
        #I'm assuming here that we're not doing anything fancy with bad input
        stop("sizes do not evenly partition data!")
    }else{
        #Shuffle data frame
        # Note we don't need as.data.frame()
        values <- values[sample(nrow(values)),]

        #Split data frame
        values <- split(values,rep(seq_len(nrow(values)),times = sizes))
        #Create the output file paths
        paths <- paste0(endPath,"/group_",seq_along(sizes))
        #We could shoe-horn this into lapply, but there's no real need
        for (i in seq_along(values)){
            write.csv(x = values[[i]],file = paths[i],row.names = FALSE)
        }
    }
}
于 2013-11-07T02:05:23.807 に答える