我正在尝试编写一个带有data.frames(somelist
)列表的函数,并将它们写入.csv文件,每个文件的名称与正在编写的data.frame相同(即{ {1}},a1.csv
,a2.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
)更适合效率和正确的编码礼仪。
答案 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){})