【问题标题】:How to create a list of tibbles (from xlsx files) in R without losing data?如何在 R 中创建小标题列表(来自 xlsx 文件)而不丢失数据?
【发布时间】:2021-06-29 05:10:13
【问题描述】:

我需要在 R 中读取一些反复无常的 xlsx 文件。将它们转换为 csv 会弄乱列名,因此我不得不使用替代方法。我可以使用库 readxl 和函数 read_xlsx() 读取我的文件。

我的想法是循环读取每个文件以验证它们并将它们放入列表中。然后循环列表的每个元素并为每个文件执行工作。

但是,read_xlsx() 输出是一个小标题。我对他们一无所知,但他们似乎不喜欢被放入列表或从列表中提取。

例如,我使用这样的excel文件

this is a test
1 2 3 4
5 6 7 8

使用这样的代码:

filenames <- list.files(path = "../Data")
dataList <- list()

for (filename in filenames) {
  filepath <- paste0("../Data/", filename)
  data <- read_xlsx(filepath)
  print(data)
  dataList[filename] <- data
  print(dataList)
}

输出将是

# A tibble: 2 x 4
   this    is     a  test
  <dbl> <dbl> <dbl> <dbl>
1     1     2     3     4
2     5     6     7     8

[[1]]
[1] 1 5

为什么我丢失了这么多数据?有什么方法可以创建一个 tibbles 列表以便以后操作列表中的每个元素?

【问题讨论】:

    标签: r list tibble readxl


    【解决方案1】:

    要访问列表项,您需要 [[ 而不是 [

    filenames <- list.files(path = "../Data")
    dataList <- list()
    
    for (filename in filenames) {
      filepath <- paste0("../Data/", filename)
      data <- read_xlsx(filepath)
      dataList[[filename]] <- data
    }
    

    实现此目的的另一种方法是 foreach 包,它将返回一个列表。

    library(foreach)
    
    dataList <- foreach(filename = filenames, 
                        .final = function(x) { setNames(x, filenames) }) %do% {
      filepath <- paste0("../Data/", filename)
      data <- read_xlsx(filepath)
      data
    }
    

    【讨论】:

    • 哦,我刚刚花了一个多小时在这上面,这太简单了……非常感谢!
    猜你喜欢
    • 2017-03-20
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2016-09-10
    • 2013-12-06
    相关资源
    最近更新 更多