data.table
목록 열을 사용하여 데이터 저장
수색…
소개
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