在R中的函数中保存Stata文件

时间:2013-07-17 01:10:05

标签: r function save stata

我正在尝试将文件从一个文件夹移动到另一个文件夹。我有一个名为“data”的数据框,其中包含“from”位置,“to”位置和文件名“myfile”。

library(foreign)


movefile <- function(from, to, myfile){
  readfile <- paste(from, myfile, sep = "/")
  temp <- read.dta(readfile)
  copyto <- paste(to, myfile, sep = "/")
  write.dta(temp, copyto)
}

当我使用以下代码行调用函数时:

movefile(data$from, data$to, data$myfile)

它只复制第一个文件。当我尝试通过在函数中打印各种术语来诊断问题时(例如,添加print(copyto)作为函数的最后一行),它会打印数据中列出的每个文件,表明该函数正在为每一行运行数据,但它实际上并不复制第一个以外的文件。我怎么能纠正这个?

3 个答案:

答案 0 :(得分:8)

除非你真的需要使用data.frame将文件作为read.dta读入内存,否则我建议使用file.copy,它将使用计算机文件系统复制文件。

 original.files <- do.call('file.path', data[c('from','myfile')])
 new.files <- do.call('file.path', data[c('to','myfile')])

 # overwrite will overwrite, so make sure you mean to do this 
 file.copy(from = original.files, to = new.files, overwrite = TRUE)

答案 1 :(得分:4)

问题是write.dta没有矢量化,因此你的功能也不是。您可以使用mapply作为@agstudy标记,将调用向量化为movefile,或向量movefile本身。要了解的一个函数是Vectorize,这是一种向量化任何函数的简单方法。

movefile <- Vectorize(movefile)

这适用于一般情况,但可能不是最有效或最透明的方法。您也可以在内部重写movefile

movefile <- function(from, to, myfile)
{
    readfile <- file.path(from, myfile)
    copyto <- file.path(to, myfile)
    mapply(function(f1, f2) write.dta(read.dta(f1), f2), readfile, copyto)
}

答案 2 :(得分:3)

您可以使用mapply例如:

mapply(movefile,data$from, data$to, data$myfile)

例如,在movefile的简化版本中对此进行测试:

data <- data.frame(from=1:2,to=2:3,myfile=c('a','b'))
movefile <- function(from, to, myfile){
  readfile <- paste(from, myfile,to, sep = "/")
}
mapply(movefile,data$from, data$to, data$myfile)

[1] "1/a/2" "2/b/3"