데이터 프레임 목록을 작성하려면 어떻게 해야 합니까?
데이터 프레임 목록을 작성하려면 어떻게 해야 하며 목록에서 각 데이터 프레임에 액세스하려면 어떻게 해야 합니까?
예를 들어, 이러한 데이터 프레임을 어떻게 리스트에 넣을 수 있습니까?
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
다른 답변에서는 이미 다수의 데이터 프레임이 있을 때 data.frames 목록을 작성하는 방법을 보여 줍니다.예를 들어 다음과 같습니다.d1,d2, ......순차적으로 명명된 데이터 프레임을 갖는 것은 문제가 됩니다.이 프레임을 리스트에 넣는 것은 좋은 수정 방법이지만, 베스트 프랙티스는 처음부터 리스트에 없는 다수의 data.frames를 피하는 것입니다.
다른 답변에서는 데이터 프레임을 목록 요소에 할당하고 액세스 하는 방법에 대해 자세히 설명합니다.여기서도 조금 설명하겠습니다만, 요점은, 리스트의 추가 대상이 될 때까지 기다리지 말아 주세요. 목록부터 시작하세요.
이 답변의 나머지 부분에서는 순차 변수를 만들고 싶은 일반적인 경우에 대해 설명하고 목록으로 바로 이동하는 방법을 보여 줍니다.R에 있는 목록을 처음 접하는 경우 목록 요소에 액세스하는 것과 사이의 차이점은 무엇입니까?를 읽어보실 수도 있습니다.
처음부터 리스트
하지 마세요d1 d2 d3 , , , , , , , ,dn목록을 .dn★★★★★★★★★★★★★★★★★★.
여러 파일을 데이터 프레임 목록으로 읽기
이것은 파일을 읽을 때 꽤 쉽게 할 수 있습니다.data1.csv, data2.csv, ... your 。목표는 data.frames data.frames 라고 하는 data.입니다.mydata가장 먼저 필요한 것은 모든 파일 이름을 가진 벡터입니다. 페이스트)로할 수 .my_files = paste0("data", 1:5, ".csv") 하면 더 하기 쉬울 예요.) , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .list.files모든 적절한 파일을 가져옵니다.my_files <- list.files(pattern = "\\.csv$")할 수 정규 에 대한 내용은 하십시오. 정규 표현을 사용하여 파일을 대조할 수 있습니다.도움이 필요한 경우 다른 질문에서 정규 표현에 대한 자세한 내용을 읽어보십시오.이렇게 하면 CSV 파일이 적절한 이름 지정 방식을 따르지 않더라도 모든 CSV 파일을 가져올 수 있습니다.또는 여러 CSV 파일에서 특정 CSV 파일을 선택해야 할 경우 fancier regex 패턴을 사용할 수 있습니다.
의 R 는 R을 합니다.for루프, 그리고 그건 문제될 게 없어요, 그냥 잘 작동해요.
my_data <- list()
for (i in seq_along(my_files)) {
my_data[[i]] <- read.csv(file = my_files[i])
}
은 【REDA】를 사용하는 입니다.lapply , for the the the the the the ,의
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 = "")
데이터 프레임을 데이터 프레임 목록으로 분할
은 매우 함수는 this this 、 기 、 this 、 this 、 this 、 this this 。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데이터 프레임의 리스트에는, 다음의 3개의 적절한 선택지가 있습니다.
# 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★★★★★★★★★★★★★★★★★★★★★」
데이터 프레임 목록을 병합(결합)하려면 다음과 같은 응답을 볼 수 있습니다.종종, 아이디어는 다음과 같이 사용하는 것입니다.Reducemerge(또는 다른 결합 기능)을 결합할 수 있습니다.
하지만 난 정말 순차적으로 명명된 변수가 필요해
수하다면, 할 수 모든 다 해 . 하지만 만약 필요하다면, 가능한 모든 것을 할 수 있습니다.list에 '어울리다'를 요.list2env() 항목을. , 다음과 같습니다..GlobalEnv.
왜 데이터를 목록에 넣을까요?
프레임과 때문에 또, 같은 기능을 .lapply,sapply do.call, 패키지 및 이전 패키지plyr l*ply이데올로기 때문에목록을 가지고 쉽게 일을 하는 사람들의 예는 SO 곳곳에 있다.
loop을 하더라도 lowly for loop을 사용하여 변수 을 lowly for loop으로 보다 목록 것이.paste '하다'로 접근합니다.get디버깅도 간단합니다.
scalability에 대해 생각해 봅시다.변수가 3개만 필요한 경우에는d1,d2,d3하지만 6개가 정말 필요한 것으로 판명되면 타이핑이 훨씬 더 많이 필요하게 됩니다. 다음할 때 코드 수 find하여 10을 20으로 바꿀 수 있습니다.변경하기 위해 찾기/바꾸기를 사용할 수도 있습니다.d14로로 합니다.d15프로그래밍이 이렇게 되어서는 안 된다고 생각하시는군요.리스트를 사용하는 경우, 3건, 30건, 300건의 차이는 최대 1행의 코드입니다.예를 들어, 몇 개의 케이스에 의해서 자동적으로 검출되는 경우는, 전혀 변화하지 않습니다..csv파일이 디렉토리에 있습니다.
데이터 프레임에 액세스하기 위해 숫자 인덱스 이외의 것을 사용하려는 경우 목록의 요소에 이름을 지정할 수 있습니다(둘 다 사용할 수 있습니다. XOR을 선택할 수 없습니다).
전체적으로 목록을 사용하면 보다 깨끗하고 읽기 쉬운 코드를 쓸 수 있으므로 버그와 혼동이 줄어듭니다.
여러분들의과 관련이 , 은 이 질문을 사용하고 .= and<-★★★★★★★★★★★★★★★★★★「 」를 사용하고 <- 하면 y1 ★★★★★★★★★★★★★★★★★」y2모든 환경에서 작업을 수행할 수 있습니다.
d1 <- data.frame(y1 <- c(1, 2, 3), y2 <- c(4, 5, 6))
y1
# [1] 1 2 3
y2
# [1] 4 5 6
이렇게 하면 데이터 프레임에 열 이름을 만들 때 원하는 효과를 얻을 수 없습니다.
d1
# y1....c.1..2..3. y2....c.4..5..6.
# 1 1 4
# 2 2 5
# 3 3 6
=연산자는 .data.frame.
데이터 프레임의 리스트 작성은 간단합니다.
d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
my.list <- list(d1, d2)
다른 목록 요소에 액세스할 때와 마찬가지로 데이터 프레임에 액세스할 수 있습니다.
my.list[[1]]
# y1 y2
# 1 1 4
# 2 2 5
# 3 3 6
열 및 수 .[ ★★★★★★★★★★★★★★★★★」[[을 사용하다목록 내각의 첫 수 .lapply(ldf, "[", 1)서, snowledge.1컬럼 번호를 나타냅니다.
ldf <- list(d1 = d1, d2 = d2) ## create a named list of your data frames
lapply(ldf, "[", 1)
# $d1
# y1
# 1 1
# 2 2
# 3 3
#
# $d2
# y1
# 1 3
# 2 2
# 3 1
마찬가지로 두 번째 열의 첫 번째 값에 액세스할 수 있습니다.
lapply(ldf, "[", 1, 2)
# $d1
# [1] 4
#
# $d2
# [1] 6
열 볼 .[[
lapply(ldf, "[[", 1)
# $d1
# [1] 1 2 3
#
# $d2
# [1] 3 2 1
연속적으로 이름이 붙은 데이터 프레임의 수가 많은 경우 다음과 같이 데이터 프레임의 원하는 서브셋 목록을 작성할 수 있습니다.
d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))
my.list <- list(d1, d2, d3, d4)
my.list
my.list2 <- lapply(paste('d', seq(2,4,1), sep=''), get)
my.list2
서 ''는my.list2는 두 번째, 세 번째 및 네 번째 데이터 프레임을 포함하는 목록을 반환합니다.
[[1]]
y1 y2
1 3 6
2 2 5
3 1 4
[[2]]
y1 y2
1 6 3
2 5 2
3 4 1
[[3]]
y1 y2
1 9 8
2 9 8
3 9 8
다만, 상기 리스트의 데이터 프레임에는 이름이 붙지 않게 됩니다.데이터 프레임의 서브셋을 포함한 리스트를 작성하고, 그 이름을 보존하려면 , 다음의 순서를 실행합니다.
list.function <- function() {
d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))
sapply(paste('d', seq(2,4,1), sep=''), get, environment(), simplify = FALSE)
}
my.list3 <- list.function()
my.list3
반환되는 값:
> my.list3
$d2
y1 y2
1 3 6
2 2 5
3 1 4
$d3
y1 y2
1 6 3
2 5 2
3 4 1
$d4
y1 y2
1 9 8
2 9 8
3 9 8
> str(my.list3)
List of 3
$ d2:'data.frame': 3 obs. of 2 variables:
..$ y1: num [1:3] 3 2 1
..$ y2: num [1:3] 6 5 4
$ d3:'data.frame': 3 obs. of 2 variables:
..$ y1: num [1:3] 6 5 4
..$ y2: num [1:3] 3 2 1
$ d4:'data.frame': 3 obs. of 2 variables:
..$ y1: num [1:3] 9 9 9
..$ y2: num [1:3] 8 8 8
> my.list3[[1]]
y1 y2
1 3 6
2 2 5
3 1 4
> my.list3$d4
y1 y2
1 9 8
2 9 8
3 9 8
같은 이름의 data.frames(여기서 d#은 정의 정수)가 「대량」으로 설정되어 있는 것을 상정하고, @mark-miller의 방법을 약간 개선한 것을 다음에 나타냅니다.보다 간결하고 data.frames라는 이름의 목록을 반환합니다.여기서 목록의 각 이름은 대응하는 원래 data.frame의 이름입니다.
는 '아까보다'를 사용하는 입니다.mget ls 및 을 가진 한 객체일 d2는 d#이라는 이름을 가진 객체입니다.
my.list <- mget(ls(pattern="^d[0-9]+"))
그것은 돌아올 것이다.
my.list
$d1
y1 y2
1 1 4
2 2 5
3 3 6
$d2
y1 y2
1 3 6
2 2 5
3 1 4
은 패턴의 합니다.ls이를 통해 정규 표현을 사용하여 환경 내의 객체 이름을 보다 세밀하게 분석할 수 있습니다. "^d[0-9]+$""^d\\d+$".
@gregor가 지적한 바와 같이 데이터 구축 프로세스를 전체적으로 셋업하여 처음에 data.frames를 이름 있는 목록에 넣는 것이 좋습니다.
데이터.
d1 <- data.frame(y1 = c(1,2,3),y2 = c(4,5,6))
d2 <- data.frame(y1 = c(3,2,1),y2 = c(6,5,4))
for
만약 내가 가지고 있다면for은 빈 프레임으로 합니다.list()데이터 프레임이 생성될 때 추가할 수 있습니다.
# Empty list
dat_list <- list()
for(i in 1:5){
# Generate dataframe
dat <- data.frame(x=rnorm(10), y=rnorm(10))
# Add to list
dat_list <- append(dat_list, list(dat))
}
list(dat)우리 안에append()discl.discl.discl을 클릭합니다.
데이터 액세스
★★★★★★★★★★★★★★★★★★★★★★.n에서 데이터 은 데이터 프레임이다.dat_list[[n]] 할 수 를 들어, 이 데이터 프레임내의 데이터에 액세스 할 수 .dat_list[[2]]$x.
모든 프레임에서 sapply(dat_list, "[", "x").
@Gregor Thomas의 답변을 참조하십시오.fordisplaces.displaces
저는 완전히 초보라고 생각합니다만, 여기에 기재되어 있지 않은 최초의 서브 질문 중 하나, 즉 데이터 프레임이나 그 일부에의 액세스에 대한 지극히 간단한 답을 가지고 있다고 생각합니다.
먼저 위에서 설명한 대로 데이터 프레임을 사용하여 목록을 작성합니다.
d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
my.list <- list(d1, d2)
그런 다음 데이터 프레임 중 하나에서 특정 값에 액세스하려면 이중 대괄호를 순서대로 사용합니다.첫 번째 세트는 데이터 프레임으로 이동하고 두 번째 세트는 특정 좌표로 이동합니다.
my.list[[1]][3, 2]
[1] 6
조금 늦을 수도 있지만, 당신의 예시로 돌아가서 답변을 조금 더 늘려야겠다고 생각했습니다.
D1 <- data.frame(Y1=c(1,2,3), Y2=c(4,5,6))
D2 <- data.frame(Y1=c(3,2,1), Y2=c(6,5,4))
D3 <- data.frame(Y1=c(6,5,4), Y2=c(3,2,1))
D4 <- data.frame(Y1=c(9,9,9), Y2=c(8,8,8))
그러면 목록을 쉽게 만들 수 있습니다.
mylist <- list(D1,D2,D3,D4)
이제 목록이 있지만 목록에 액세스하는 대신 다음과 같은 이전 방법으로
mylist[[1]] # to access 'd1'
이 기능을 사용하여 원하는 데이터 프레임을 가져오고 할당할 수 있습니다.
GETDF_FROMLIST <- function(DF_LIST, ITEM_LOC){
DF_SELECTED <- DF_LIST[[ITEM_LOC]]
return(DF_SELECTED)
}
이제 네가 원하는 걸 가져.
D1 <- GETDF_FROMLIST(mylist, 1)
D2 <- GETDF_FROMLIST(mylist, 2)
D3 <- GETDF_FROMLIST(mylist, 3)
D4 <- GETDF_FROMLIST(mylist, 4)
조금 더 도움이 되길 바랍니다.
건배!
매우 간단합니다! 제 제안은 다음과 같습니다.
워크스페이스에서 데이터 프레임을 선택하는 경우는, 다음의 순서에 따릅니다.
Filter(function(x) is.data.frame(get(x)) , ls())
또는
ls()[sapply(ls(), function(x) is.data.frame(get(x)))]
이 모든 것이 같은 결과를 가져올 것입니다.
수 요.is.data.frame하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다, 체크하다.is.function
할 수 .lst()개체를 기반으로 목록에 자동으로 이름을 지정합니다.
library(tibble)
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
lst(d1, d2)
# $d1
# y1 y2
# 1 1 4
# 2 2 5
# 3 3 6
#
# $d2
# y1 y2
# 1 3 6
# 2 2 5
# 3 1 4
나중에 이름으로 참조할 목록을 컴파일할 때 유용합니다.
언급URL : https://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames
'programing' 카테고리의 다른 글
| UITableView에서 빈 셀 사이의 구분 기호를 강제로 숨길 수 있습니까? (0) | 2023.04.15 |
|---|---|
| WPF 어플리케이션을 Windows 7에서도 메트로 스타일로 할 수 있습니까? (Windows Chrome / Theming / Theme ) (0) | 2023.04.15 |
| C#을 사용하여 파일 전체를 문자열로 읽는 방법 (0) | 2023.04.10 |
| WPF - 표준 버튼을 사용하여 위 화살표와 아래 화살표 버튼을 만듭니다. (0) | 2023.04.10 |
| Excel 수식에서 빈 셀 반환 (0) | 2023.04.10 |