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?
}
  }

当我尝试在适当的位置 (A) 执行某些操作时,例如 write.csv(x= paste('group', i, sep=''), file= paste(endPath, '/group', i, '.csv', sep=''), row.names=FALSE 出现错误或将字符串“group1”直接写入 csv,而不是我正在寻找的随机数据帧的块。我非常困惑,因为这似乎是我遇到了 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 回答