簡體   English   中英

將多個 .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))

有時有效,但有時會失敗。 這些文件也可在此鏈接上找到 我想讀取所有文件並將它們保存為具有相同名稱的.RDATA

由於鏈接的數據部分有點不干凈,我根據這個示例數據向您展示您問題核心問題的解決方案:

(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 <- 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 文件。 一個缺點是,當您在 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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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