Rを使用して、すべてが.txt形式のデータを視覚化しています。ディレクトリには数百のファイルがあり、すべてを1つのテーブルに一度にロードしたいと考えています。
何か助けは?
編集:
ファイルのリストは問題ではありません。しかし、私はリストからコンテンツに行くのに苦労しています。 here のコードをいくつか試しましたが、この部分でバグが発生します。
all.the.data <- lapply( all.the.files, txt , header=TRUE)
言っている
Error in match.fun(FUN) : object 'txt' not found
この問題を明確にするコードスニペットをいただければ幸いです。
すべての回答をありがとう!
その間、私もメソッドを自分でハッキングしました。それが便利かどうか教えてください:
library(foreign)
setwd("/path/to/directory")
files <-list.files()
data <- 0
for (f in files) {
tempData = scan( f, what="character")
data <- c(data,tempData)
}
あなたはこれを試すことができます:
filelist = list.files(pattern = ".*.txt")
#assuming tab separated values with a header
datalist = lapply(filelist, function(x)read.table(x, header=T))
#assuming the same header/columns for all files
datafr = do.call("rbind", datalist)
複数のファイルを読み取り、それらを単一のデータフレームまたはdata.tableに配置するには、2つの高速な方法があります。
最初にすべてのtxtファイル(サブフォルダー内のファイルを含む)のリストを取得します
_list_of_files <- list.files(path = ".", recursive = TRUE,
pattern = "\\.txt$",
full.names = TRUE)
_
1)Use fread()
w / rbindlist()
_data.table
_ パッケージから
_#install.packages("data.table", repos = "https://cran.rstudio.com")
library(data.table)
# Read all the files and create a FileName column to store filenames
DT <- rbindlist(sapply(list_of_files, fread, simplify = FALSE),
use.names = TRUE, idcol = "FileName")
_
2)使用 readr::read_table2()
w / purrr::map_df()
tidyverse
フレームワークから:
_#install.packages("tidyverse",
# dependencies = TRUE, repos = "https://cran.rstudio.com")
library(tidyverse)
# Read all the files and create a FileName column to store filenames
df <- list_of_files %>%
set_names(.) %>%
map_df(read_table2, .id = "FileName")
_
注:ファイル名をクリーンアップするには、basename
またはgsub
関数を使用します
編集1:複数のcsv
ファイルを読み取り、 _readr::read_csv
_ を使用してheader
をスキップします
_list_of_files <- list.files(path = ".", recursive = TRUE,
pattern = "\\.csv$",
full.names = TRUE)
df <- list_of_files %>%
purrr::set_names(nm = (basename(.) %>% tools::file_path_sans_ext())) %>%
purrr::map_df(read_csv,
col_names = FALSE,
skip = 1,
.id = "FileName")
_
編集2:ワイルドカードを含むパターンを同等の正規表現に変換するには、 glob2rx()
関数dir()
またはlist.files()
のヘルプを参照してください。これにより、ループする可能性がある正規表現でフィルタリングされたファイルのリストを取得できます。
それらすべてを一度にしたい場合は、最初にコンテンツを1つのファイルに含める必要があります。 1つのオプションは、cat
を使用してすべてのファイルをstdout
に入力し、popen()
を使用してそれを読み取ることです。詳細については、help(Connections)
を参照してください。
readtextパッケージは、これを実行するための本当に簡単な方法です。
readtext::readtext("path_to/your_files/*.txt")
本当に簡単です。