将多个.dat文件作为列表读取并在R中另存为.RDATA文件

问题描述 投票:-3回答:2

我想从目录导入多个.DAT文件,并将它们作为列表元素,然后将它们保存为.RDATA文件。

我尝试了以下代码

files <- dir(pattern = "*.DAT")
library(tidyverse)
Data1 <- 
  files %>%
    map(~ read.table(file = ., fill = TRUE))

它有时会起作用并且会失败。这些文件也可以在this link上找到。我想读取所有文件,然后将它们保存为.RDATA,名称相同。

r purrr read.table rdata dat-protocol
2个回答
1
投票

由于链接的数据有点不干净,我会根据这个示例数据向您展示您的问题的核心问题的解决方案:

(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名称,我们在list中使用save()选项。

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 <- 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

但是,如前面引言中所述,数据部分有点不清洁,您可能需要单独处理它们并根据情况调整代码。


0
投票

这应该让你接近。它从您的目录中读取所有.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)
}
© www.soinside.com 2019 - 2024. All rights reserved.