R:在“apply”函数期间访问和使用列表中的data.frames的名称

时间:2015-03-08 03:46:44

标签: r

我正在尝试编写一个带有data.frames(somelist)列表的函数,并将它们写入.csv文件,每个文件的名称与正在编写的data.frame相同(即{ {1}},a1.csva2.csv)。

a3.csv

这是我最接近的,相反,这些文件被命名为somelist <- list(a1 = data.frame(a = 1, b = 2, c = 3), a2 = data.frame(d = 4, e = 5, f = 6), a3 = data.frame(g = 7, h = 8, i = 9)) csvout <- function (y) { z <- deparse(substitute(y)) write.table(y, file = paste0("~/somefolder/", z, ".csv"), sep = ",", row.names = FALSE) print(z) } sapply(somelist, csvout) 打印的内容:

z

在搜索文档中寻找答案时,我认为我在[1] "X[[1L]]" [1] "X[[2L]]" [1] "X[[3L]]" a1 a2 a3 "X[[1L]]" "X[[2L]]" "X[[3L]]" 处于正确的轨道,但我无法连接这些点:

  

由于历史原因,lapply创建的调用未被评估,   并且代码已经被写入(例如,bquote),依赖于此。这个   表示录制的呼叫始终为FUN(X [[i]],...)形式,   用i替换为当前(整数或双精度)索引

更新

我可以使用类似于?sapply编程的语法来使用for循环...

C

但我正在尝试在for (i in 1:length(somelist)) { write.table(i, file = paste0("~/somefolder/", names(somelist)[i], ".csv"), sep = ",", row.names = FALSE) } 中更原生地编码,我知道R系列,或者至少使用矢量化apply循环(即{{1}而不是for)更适合效率和正确的编码礼仪。

2 个答案:

答案 0 :(得分:1)

这真的,真的,非常脏,但我认为它的工作方式正如你所描述的那样。当然,对于超过9个data.frames,它需要在替代部分进行调整。

csvout <- function (y, csvnames) {
  write.table(y, file = paste0("test",
                                   csvnames[as.numeric(substr(deparse(substitute(y)),4,4))],
                               ".csv"),
              sep = ",",
              row.names = FALSE)
}

sapply(somelist, FUN=csvout, names(somelist))

我想你知道这一点,但如果你实现了一个FOR循环而不是sapply,这将更加容易,因为你可以直接用names函数引用data.frame名称。

编辑: 这是FOR循环解决方案,无论你有多少数据帧,它都可以工作:

csvout <- function (y) {
  for (i in 1:length(y)){
    write.table(y[i], file = paste0("test",
                                 names(y)[i],
                                 ".csv"),
                sep = ",",
                row.names = FALSE)  
  }  
}

csvout(somelist)

答案 1 :(得分:1)

您可以像apply

类似的方式使用apply(1:length,function(i){})