簡體   English   中英

R:在“應用”功能期間訪問和使用列表中的數據幀的名稱

[英]R: Accessing and using names of data.frames within a list during an `apply` function

我正在嘗試編寫一個函數,該函數接受data.frames的列表( somelist )並將其寫到.csv文件中,每個文件都與要寫入的data.frame相同(即, a1.csva2.csva3.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM