[英]R: Accessing and using names of data.frames within a list during an `apply` function
我正在嘗試編寫一個函數,該函數接受data.frames的列表( somelist
)並將其寫到.csv文件中,每個文件都與要寫入的data.frame相同(即, 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]]"
在搜索文檔中尋找答案時,我認為我在?sapply
處於正確的軌道,但是我一直無法連接點:
由於歷史原因,lapply創建的調用未被評估,並且已經編寫了依賴於此的代碼(例如bquote)。 這意味着記錄的呼叫始終為FUN(X [[i]],...)形式,其中i替換為當前(整數或雙精度)索引
更新
我可以使用類似於C
編程的語法來使用for
循環...
for (i in 1:length(somelist)) {
write.table(i, file = paste0("~/somefolder/",
names(somelist)[i],
".csv"),
sep = ",",
row.names = FALSE)
}
但是我正在嘗試使用R
進行更本地的編碼,並且我知道apply
族,或者至少使用向量化的for
循環(即for (all in somelist) {
而不是for (i in 1:length(somelist)) {
)對於效率和適當的編碼禮節而言更可取。
這確實確實非常骯臟,但是我認為它可以按照您的描述工作。 當然,對於9個以上的data.frame,需要在替代部分中進行調整。
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循環解決方案,無論您有多少data.frames,它都可以工作:
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)
您可以以類似於apply(1:length,function(i){})
方式使用apply
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.