수색…


소개

Data.table은 R의 list 클래스에 속하는 열 벡터를 지원합니다.

비고

코드에서 해당 단어를 사용하지 않고 목록에 대해 이야기하는 것이 이상하게 보일 경우 DT[...] 호출에서 .()list() 의 별칭임을 유의하십시오.

많은 관련 파일 읽기

비슷한 형식의 파일들을 읽고 쌓고 싶다고합시다. 빠른 해결책은 다음과 같습니다.

rbindlist(lapply(list.files(patt="csv$"), fread), id=TRUE)

몇 가지 이유로이 점에 만족하지 않을 수 있습니다.

  • 일치하지 않거나 버그가있는 데이터 형식으로 인해 fread 읽거나 rbindlist 로 스태킹 할 때 오류가 발생할 수 있습니다.
  • 우리는 각 파일에 대한 메타 데이터를 추적하고, 파일 이름에서 얻거나, 아마도 테이블 형식이 아닌 파일 내의 일부 헤더 행을 추적하려고 할 수 있습니다.

이를 처리하는 한 가지 방법은 "파일 테이블"을 만들고 각 파일의 내용을 연관된 행의 목록 열 항목으로 저장하는 것입니다.

데이터 예

아래 예제 데이터를 만들기 전에 쓸 수있는 빈 폴더에 있는지 확인하십시오. getwd() 실행하고 폴더를 변경해야하는 경우 ?setwd 읽습니다.

# example data
set.seed(1)
for (i in 1:3) 
  fwrite(data.table(id = 1:2, v = sample(letters, 2)), file = sprintf("file201%s.csv", i))

파일 및 파일 메타 데이터 식별

이 부분은 매우 간단합니다.

# First, identify the files you want:
fileDT = data.table(fn = list.files(pattern="csv$"))

# Next, optionally parse the names for metadata using regex:
fileDT[, year := type.convert(sub(".*([0-9]{4}).*", "\\1", fn))]

# Finally construct a string file-ID column:
fileDT[, id := as.character(.I)]

#              fn year id
# 1: file2011.csv 2011  1
# 2: file2012.csv 2012  2
# 3: file2013.csv 2013  3

파일 읽기

파일을 목록 열로 읽습니다.

fileDT[, contents := .(lapply(fn, fread))]

#              fn year id     contents
# 1: file2011.csv 2011  1 <data.table>
# 2: file2012.csv 2012  2 <data.table>
# 3: file2013.csv 2013  3 <data.table>

파일 중 하나를 읽는데 장애가 있거나 파일의 속성에 따라 인수를 fread 로 변경해야하는 경우이 단계는 다음과 같이 쉽게 확장 될 수 있습니다.

fileDT[, contents := {
  cat(fn, "\n")

  dat = if (year %in% 2011:2012){
    fread(fn, some_args)
  } else {
    fread(fn)
  }

  .(.(dat))
}, by=fn]

CSV 및 이와 유사한 파일을 읽는 옵션에 대한 자세한 내용은 ?fread 참조하십시오.

데이터 스택

여기에서 우리는 데이터를 스택 싶습니다 :

fileDT[, rbindlist(setNames(contents, id), idcol="file_id")]

#    file_id id v
# 1:       1  1 g
# 2:       1  2 j
# 3:       2  1 o
# 4:       2  2 w
# 5:       3  1 f
# 6:       3  2 w

스태킹에서 어떤 문제 (예 : 일치하지 않는 열 이름이나 클래스)가 발생하면 fileDT 의 개별 테이블로 fileDT 문제가 발생한 위치를 검사 할 수 있습니다. 예를 들어,

fileDT[id == "2", contents[[1]]]
#    id v
# 1:  1 o
# 2:  2 w

확장 프로그램

파일이 현재 작업 디렉토리에 없으면 다음을 사용하십시오.

my_dir = "whatever"
fileDT = data.table(fn = list.files(my_dir, pattern="*.csv"))

# and when reading
fileDT[, contents := .(lapply(fn, function(n) fread(file.path(my_dir, n))))]


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow