读取多个 .dat 文件作为列表并在 R 中保存为 .RDATA 文件
Reading multiple .dat files as a list and saving as .RDATA files in R
我想从一个目录中导入多个 .DAT
文件并将它们作为列表元素,然后将它们另存为 .RDATA
个文件。
我尝试了以下代码
files <- dir(pattern = "*.DAT")
library(tidyverse)
Data1 <-
files %>%
map(~ read.table(file = ., fill = TRUE))
有时有效,有时失败。这些文件也可以在 this link 上找到。我想读取所有文件并将它们另存为 .RDATA
并具有相同的名称。
这应该会让你接近。它从您的目录中读取所有 .dat 文件,并使用适当的名称将它们保存为您目录中的 .RData 文件。一个缺点是,当您在 R 中打开它们时,它们会保留 "temp.file" 名称,因此您必须手动重命名它们或一次只打开一个。不确定如何解决这个问题。
file.list <- lapply(1:length(dir()), function(x) read.delim(dir()[x], header=FALSE))
names.list <- lapply(1:length(dir()), function(x) gsub(".dat", "", dir()[x]))
for(i in 1:length(file.list)){
temp.file <- file.list[[i]]
temp.name <- paste(names.list[[i]], ".RData", sep="")
save(temp.file, file=temp.name)
}
由于link的部分数据有些不干净,我在这个例子数据的基础上给你解决你问题的核心问题:
(name1 <- name2 <- name3 <- name4 <- name5 <- data.frame(matrix(1:12, 3, 4)))
# X1 X2 X3 X4
# 1 1 4 7 10
# 2 2 5 8 11
# 3 3 6 9 12
我们将数据保存到名为 "test"
.
的工作目录的子目录中
l <- mget(ls(pattern="^name"))
DIR <- "test"
# dir.create(DIR) # leave out if dir already exists
sapply(1:length(l), function(x)
write.table(l[[x]], file=paste0(DIR, "/", names(l)[x], ".dat"), row.names=FALSE))
现在我们看看里面有什么"test"
。
dir(DIR)
# [1] "name1.dat" "name2.dat" "name3.dat" "name4.dat" "name5.dat"
现在我们按模式导入目录中的文件。我使用 rio::import_list
,它很好地将文件导入到列表中,并在其中使用 data.table::fread
。但是您自己的代码也可以正常工作。
# rm(list=ls()) # commented out for user safety
L <- rio::import_list(paste0(DIR, "/", dir(DIR, pattern="\.dat$")), format="tsv")
为了将它们保存为 .Rdata
,我们希望动态地 assign
命名,我们使用 save()
.
中的 list
选项来实现。
sapply(seq_along(L), function(x) {
tmp <- L[[x]]
assign(names(L)[x], tmp)
save(list=names(L)[x], file=paste0(DIR, "/", names(L)[x], ".Rdata"))
})
当我们列出目录时,我们看到数据已创建。
dir(DIR)
# [1] "name1.dat" "name1.Rdata" "name2.dat" "name2.Rdata" "name3.dat" "name3.Rdata"
# [7] "name4.dat" "name4.Rdata" "name5.dat" "name5.Rdata"
现在让我们看看是否也正确创建了对象名称:
# rm(list=ls()) # commented out for user safety
load("test/name1.Rdata")
ls()
# [1] "name1"
name1
# X1 X2 X3 X4
# 1 1 4 7 10
# 2 2 5 8 11
# 3 3 6 9 12
是这样的
附加选项
我们也可以尝试使用 rvest
更直接的方法。首先我们获取数据名称:
library(rvest)
dat.names <- html_attr(html_nodes(read_html(
"https://www2.stat.duke.edu/courses/Spring03/sta113/Data/Hand/Hand.html"),
"a"), "href")
并创建个人 links:
links <- as.character(sapply(dat.names, function(x)
paste0("https://www2.stat.duke.edu/courses/Spring03/sta113/Data/Hand/", x)))
余数基本同上:
DIR <- "test"
# dir.create(DIR) # leave out if dir already exists
library(rio)
system.time(L <- import_list(links, format="tsv") ) # this will take a minute
sapply(seq_along(L), function(x) {
tmp <- L[[x]]
assign(names(L)[x], tmp)
save(list=names(L)[x], file=paste0(DIR, "/", names(L)[x], ".Rdata"))
})
# rm(list=ls()) # commented out for user safety
load("test/clinical.Rdata") # test a data set
clinical
# V1 V2 V3
# 1 26 31 57
# 2 51 59 110
# 3 21 11 32
# 4 40 34 74
# 5 138 135 273
但是,如前面介绍中所述,部分数据有点不干净,您可能必须单独处理它们并根据大小写调整代码。
我想从一个目录中导入多个 .DAT
文件并将它们作为列表元素,然后将它们另存为 .RDATA
个文件。
我尝试了以下代码
files <- dir(pattern = "*.DAT")
library(tidyverse)
Data1 <-
files %>%
map(~ read.table(file = ., fill = TRUE))
有时有效,有时失败。这些文件也可以在 this link 上找到。我想读取所有文件并将它们另存为 .RDATA
并具有相同的名称。
这应该会让你接近。它从您的目录中读取所有 .dat 文件,并使用适当的名称将它们保存为您目录中的 .RData 文件。一个缺点是,当您在 R 中打开它们时,它们会保留 "temp.file" 名称,因此您必须手动重命名它们或一次只打开一个。不确定如何解决这个问题。
file.list <- lapply(1:length(dir()), function(x) read.delim(dir()[x], header=FALSE))
names.list <- lapply(1:length(dir()), function(x) gsub(".dat", "", dir()[x]))
for(i in 1:length(file.list)){
temp.file <- file.list[[i]]
temp.name <- paste(names.list[[i]], ".RData", sep="")
save(temp.file, file=temp.name)
}
由于link的部分数据有些不干净,我在这个例子数据的基础上给你解决你问题的核心问题:
(name1 <- name2 <- name3 <- name4 <- name5 <- data.frame(matrix(1:12, 3, 4)))
# X1 X2 X3 X4
# 1 1 4 7 10
# 2 2 5 8 11
# 3 3 6 9 12
我们将数据保存到名为 "test"
.
l <- mget(ls(pattern="^name"))
DIR <- "test"
# dir.create(DIR) # leave out if dir already exists
sapply(1:length(l), function(x)
write.table(l[[x]], file=paste0(DIR, "/", names(l)[x], ".dat"), row.names=FALSE))
现在我们看看里面有什么"test"
。
dir(DIR)
# [1] "name1.dat" "name2.dat" "name3.dat" "name4.dat" "name5.dat"
现在我们按模式导入目录中的文件。我使用 rio::import_list
,它很好地将文件导入到列表中,并在其中使用 data.table::fread
。但是您自己的代码也可以正常工作。
# rm(list=ls()) # commented out for user safety
L <- rio::import_list(paste0(DIR, "/", dir(DIR, pattern="\.dat$")), format="tsv")
为了将它们保存为 .Rdata
,我们希望动态地 assign
命名,我们使用 save()
.
list
选项来实现。
sapply(seq_along(L), function(x) {
tmp <- L[[x]]
assign(names(L)[x], tmp)
save(list=names(L)[x], file=paste0(DIR, "/", names(L)[x], ".Rdata"))
})
当我们列出目录时,我们看到数据已创建。
dir(DIR)
# [1] "name1.dat" "name1.Rdata" "name2.dat" "name2.Rdata" "name3.dat" "name3.Rdata"
# [7] "name4.dat" "name4.Rdata" "name5.dat" "name5.Rdata"
现在让我们看看是否也正确创建了对象名称:
# rm(list=ls()) # commented out for user safety
load("test/name1.Rdata")
ls()
# [1] "name1"
name1
# X1 X2 X3 X4
# 1 1 4 7 10
# 2 2 5 8 11
# 3 3 6 9 12
是这样的
附加选项
我们也可以尝试使用 rvest
更直接的方法。首先我们获取数据名称:
library(rvest)
dat.names <- html_attr(html_nodes(read_html(
"https://www2.stat.duke.edu/courses/Spring03/sta113/Data/Hand/Hand.html"),
"a"), "href")
并创建个人 links:
links <- as.character(sapply(dat.names, function(x)
paste0("https://www2.stat.duke.edu/courses/Spring03/sta113/Data/Hand/", x)))
余数基本同上:
DIR <- "test"
# dir.create(DIR) # leave out if dir already exists
library(rio)
system.time(L <- import_list(links, format="tsv") ) # this will take a minute
sapply(seq_along(L), function(x) {
tmp <- L[[x]]
assign(names(L)[x], tmp)
save(list=names(L)[x], file=paste0(DIR, "/", names(L)[x], ".Rdata"))
})
# rm(list=ls()) # commented out for user safety
load("test/clinical.Rdata") # test a data set
clinical
# V1 V2 V3
# 1 26 31 57
# 2 51 59 110
# 3 21 11 32
# 4 40 34 74
# 5 138 135 273
但是,如前面介绍中所述,部分数据有点不干净,您可能必须单独处理它们并根据大小写调整代码。