web-dev-qa-db-ja.com

複数の.txtファイルをRに読み込むにはどうすればよいですか?

Rを使用して、すべてが.txt形式のデータを視覚化しています。ディレクトリには数百のファイルがあり、すべてを1つのテーブルに一度にロードしたいと考えています。

何か助けは?

編集:

ファイルのリストは問題ではありません。しかし、私はリストからコンテンツに行くのに苦労しています。 here のコードをいくつか試しましたが、この部分でバグが発生します。

all.the.data <- lapply( all.the.files,  txt  , header=TRUE)

言っている

 Error in match.fun(FUN) : object 'txt' not found

この問題を明確にするコードスニペットをいただければ幸いです。

26
Eric Brotto

すべての回答をありがとう!

その間、私もメソッドを自分でハッキングしました。それが便利かどうか教えてください:

library(foreign)

setwd("/path/to/directory")

files <-list.files()

data <- 0


for (f in files) {

tempData = scan( f, what="character")

data <- c(data,tempData)    

} 
4
Eric Brotto

あなたはこれを試すことができます:

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) 
30
Greg

複数のファイルを読み取り、それらを単一のデータフレームまたは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()

11
Tung

関数dir()またはlist.files()のヘルプを参照してください。これにより、ループする可能性がある正規表現でフィルタリングされたファイルのリストを取得できます。

それらすべてを一度にしたい場合は、最初にコンテンツを1つのファイルに含める必要があります。 1つのオプションは、catを使用してすべてのファイルをstdoutに入力し、popen()を使用してそれを読み取ることです。詳細については、help(Connections)を参照してください。

5

readtextパッケージは、これを実行するための本当に簡単な方法です。

readtext::readtext("path_to/your_files/*.txt")

本当に簡単です。

3
Ken Benoit