다른 답변을 보여 어떻게 당신이 때 data.frames의 목록을 만들기 위해 이미 예를 들어, data.frames의 무리 d1
, d2
.... 문제가 순차적으로 명명 된 데이터 프레임을 갖는, 그리고 목록에 넣어 것은입니다 좋은 수정이지만 가장 좋은 방법은 처음 에는 목록 에 없는 많은 데이터 프레임을 사용하지 않는 것입니다 .
다른 답변은 요소를 나열하고 액세스하는 등 데이터 프레임을 할당하는 방법에 대한 자세한 정보를 제공합니다. 여기서도 조금 다룰 것입니다. 그러나 요점 은 많은 것을 가질 때까지 기다리지 말아야 한다는 것 입니다. data.frames
목록에 추가하십시오. 목록부터 시작하십시오.
이 답변의 나머지 부분에서는 순차 변수를 만들고 싶은 유혹이있을 수있는 몇 가지 일반적인 경우를 다루고 목록으로 바로 이동하는 방법을 보여줍니다. R의 목록을 처음 사용하는 경우 목록 의 요소 [[
와 [
액세스 요소의 차이점은 무엇입니까? 를 읽어보십시오 . .
처음부터 목록
절대 만들지 마 d1
d2
d3
dn
처음 에는 ...을 . 요소 가 포함 된 목록 d
을 만듭니다 n
.
여러 파일을 데이터 프레임 목록으로 읽기
이것은 파일을 읽을 때 매우 쉽게 수행됩니다. data1.csv, data2.csv, ...
디렉토리에 파일 이있을 수 있습니다. 당신의 목표는 data.frames의 목록입니다mydata
. 가장 먼저 필요한 것은 모든 파일 이름을 가진 벡터입니다. 붙여 넣기 (예 :)로이를 구성 할 수 my_files = paste0("data", 1:5, ".csv")
있지만 list.files
적절한 모든 파일을 가져 오는 데 사용 하는 것이 더 쉽습니다 my_files <- list.files(pattern = "\\.csv$")
. 정규식을 사용하여 파일을 일치시킬 수 있으며, 도움이 필요한 경우 다른 질문에서 정규식에 대해 자세히 읽어보십시오. 이 방법을 사용하면 멋진 이름 지정 체계를 따르지 않아도 모든 CSV 파일을 가져올 수 있습니다. 또는 여러 CSV 파일에서 특정 CSV 파일을 선택해야하는 경우 더 멋진 정규식 패턴을 사용할 수 있습니다.
이 시점에서 대부분의 R 초보자는 for
루프 아무런 문제가 없으며 정상적으로 작동합니다.
my_data <- list()
for (i in seq_along(my_files)) {
my_data[[i]] <- read.csv(file = my_files[i])
}
더 R과 같은 방법은 lapply
위의 바로 가기 인
my_data <- lapply(my_files, read.csv)
물론 다른 데이터 가져 오기 기능을 read.csv
적절하게 대체하십시오 .readr::read_csv
또는 data.table::fread
더 빠른 것, 또는 당신은 또한 다른 파일 형식에 대해 다른 기능을해야 할 수도 있습니다.
어느 쪽이든, 파일과 일치하도록 목록 요소의 이름을 지정하는 것이 편리합니다.
names(my_data) <- gsub("\\.csv$", "", my_files)
# or, if you prefer the consistent syntax of stringr
names(my_data) <- stringr::str_replace(my_files, pattern = ".csv", replacement = "")
데이터 프레임을 데이터 프레임 목록으로 분할
이것은 매우 쉬우 며 기본 기능 split()
은 당신을 위해 그것을합니다. 데이터의 열 (또는 열) 또는 원하는 다른 항목으로 분할 할 수 있습니다.
mt_list = split(mtcars, f = mtcars$cyl)
# This gives a list of three data frames, one for each value of cyl
또한 교차 유효성 검사를 위해 데이터 프레임을 조각으로 나누는 좋은 방법입니다. mtcars
교육, 테스트 및 유효성 검사 로 나눌 수 있습니다 .
groups = sample(c("train", "test", "validate"),
size = nrow(mtcars), replace = TRUE)
mt_split = split(mtcars, f = groups)
# and mt_split has appropriate names already!
데이터 프레임 목록 시뮬레이션
아마도 당신은 다음과 같은 데이터를 시뮬레이션 할 것입니다 :
my_sim_data = data.frame(x = rnorm(50), y = rnorm(50))
그러나 누가 하나의 시뮬레이션 만합니까? 이 작업을 100 번, 1000 번 이상으로하고 싶습니다! 그러나 작업 공간에 10,000 개의 데이터 프레임을 원하지 않습니다 . 사용 replicate
하고 목록에 넣으십시오.
sim_list = replicate(n = 10,
expr = {data.frame(x = rnorm(50), y = rnorm(50))},
simplify = F)
이 경우 특히 별도의 데이터 프레임이 필요한지 또는 "그룹"열이있는 단일 데이터 프레임이 제대로 작동하는지 고려해야합니다. 사용 data.table
하거나 dplyr
데이터 그룹에 "그룹 별"작업을 수행하는 것은 매우 쉽습니다.
데이터를 목록에 넣지 않았습니다. (다음에 다시하겠습니다.하지만 지금 어떻게해야합니까?
그것들이 이상한 구색이라면 (비정상적 임), 간단히 그것들을 할당 할 수 있습니다 :
mylist <- list()
mylist[[1]] <- mtcars
mylist[[2]] <- data.frame(a = rnorm(50), b = runif(50))
...
당신이 패턴에 이름이 데이터 프레임이있는 경우 예를 들어, df1
, df2
, df3
, 그리고 당신은 목록에 원하는 작업을 수행 할 수 있습니다 get
당신은 이름과 일치하는 정규 표현식을 쓸 수 있는지를. 같은 것
df_list = mget(ls(pattern = "df[0-9]"))
# this would match any object with "df" followed by a digit in its name
# you can test what objects will be got by just running the
ls(pattern = "df[0-9]")
# part and adjusting the pattern until it gets the right objects.
일반적으로 mget
여러 객체를 가져 와서 명명 된 목록으로 반환하는 데 사용됩니다. 해당 get
객체는 단일 객체를 가져 와서 반환합니다 (목록이 아님).
데이터 프레임 목록을 단일 데이터 프레임으로 결합
일반적인 작업은 데이터 프레임 목록을 하나의 큰 데이터 프레임으로 결합하는 것입니다. 서로 겹쳐서 쌓으려면 rbind
한 쌍으로 사용 하지만 데이터 프레임 목록에는 다음 세 가지 중에서 선택할 수 있습니다.
# base option - slower but not extra dependencies
big_data = do.call(what = rbind, args = df_list)
# data table and dplyr have nice functions for this that
# - are much faster
# - add id columns to identify the source
# - fill in missing values if some data frames have more columns than others
# see their help pages for details
big_data = data.table::rbindlist(df_list)
big_data = dplyr::bind_rows(df_list)
( cbind
또는 dplyr::bind_cols
열과 유사하게 사용 )
데이터 프레임 목록을 병합 (결합)하려면 다음 답변을 볼 수 있습니다 . 종종 아이디어는 Reduce
함께 사용하는 것 입니다.merge
(또는 다른 결합 기능) 사용하는 것입니다.
왜 데이터를 목록에 넣습니까?
각 데이터 프레임에 비슷한 일을하고 싶어하고, 기능을 좋아하기 때문에 목록에 유사한 데이터를 넣고 lapply
, sapply
do.call
, 패키지 및 기존 기능은 쉽게 그렇게 할 수 있습니다. 목록으로 쉽게 일을하는 사람들의 예는 매우 다양합니다.purrr
plyr
l*ply
낮은 for 루프를 사용하더라도 변수 이름을 사용 paste
하여을 사용하여 객체에 액세스하는 것보다 목록의 요소를 반복하는 것이 훨씬 쉽습니다 get
. 디버그도 더 쉽습니다.
확장 성을 생각하십시오 . 당신이 정말로 단지 세 개의 변수, 사용에 그것의 벌금을해야하는 경우 d1
, d2
, d3
. 그러나 실제로 6이 필요하다는 것이 밝혀지면 훨씬 더 타이핑됩니다. 그리고 다음에 10 또는 20이 필요할 때 코드 줄을 복사하여 붙여 넣는 것을 발견하고 찾기 / 바꾸기를 사용하여로 변경 d14
하면 이것이 프로그래밍 방식이 아니라고d15
생각 합니다 . 목록을 사용하는 경우 3 건, 30 건, 300 건의 차이는 최대 한 줄의 코드입니다..csv
에서 파일이 없습니다 당신의 예배 규칙서.
숫자 인덱스 이외의 것을 사용하여 데이터 프레임에 액세스하려는 경우 목록의 요소 이름을 지정할 수 있습니다 (둘 다 사용할 수 있으며 XOR 선택이 아님).
전체적으로 목록을 사용하면보다 깔끔하고 읽기 쉬운 코드를 작성할 수있어 버그가 줄어들고 혼동이 줄어 듭니다.
=
하지<-
내부data.frame()
. 글로벌 환경에서<-
생성y1
하고 사용 하면y2
데이터 프레임이 원하는 것이 아닙니다.