如何在不丢失数据的情况下在 R 中创建 tibbles 列表(来自 xlsx 文件)?
How to create a list of tibbles (from xlsx files) in R without losing data?
我需要在 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 列表以便稍后操作列表中的每个元素?
要访问列表项,您需要 [[
而不是 [
。
filenames <- list.files(path = "../Data")
dataList <- list()
for (filename in filenames) {
filepath <- paste0("../Data/", filename)
data <- read_xlsx(filepath)
dataList[[filename]] <- data
}
实现此目的的另一种方法是 foreach
包,它将 return 一个列表。
library(foreach)
dataList <- foreach(filename = filenames,
.final = function(x) { setNames(x, filenames) }) %do% {
filepath <- paste0("../Data/", filename)
data <- read_xlsx(filepath)
data
}
我需要在 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 列表以便稍后操作列表中的每个元素?
要访问列表项,您需要 [[
而不是 [
。
filenames <- list.files(path = "../Data")
dataList <- list()
for (filename in filenames) {
filepath <- paste0("../Data/", filename)
data <- read_xlsx(filepath)
dataList[[filename]] <- data
}
实现此目的的另一种方法是 foreach
包,它将 return 一个列表。
library(foreach)
dataList <- foreach(filename = filenames,
.final = function(x) { setNames(x, filenames) }) %do% {
filepath <- paste0("../Data/", filename)
data <- read_xlsx(filepath)
data
}