-3

ディレクトリから複数の.DATファイルをインポートし、それらをリスト要素として作成し、.RDATAファイルとして保存したいと考えています。

次のコードを試しました

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

これは時々機能し、他の人は失敗します。ファイルは、このリンクからも入手できます。.RDATAすべてのファイルを読み取り、同じ名前で保存したい。

4

2 に答える 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に名前を付けたいときにそれらを保存するには、内のオプションで達成します。assignlistsave()

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

ただし、冒頭で述べたように、データは部分的に少し汚れているため、おそらくそれらを個別に処理し、コードをケースごとに調整する必要があります。

于 2019-04-18T17:29:18.440 に答える