2017-11-21 1 views
1

데이터를 병합하는 방식으로 구성된 데이터 프레임이 거대한 목록입니다. 기본적으로 .xls 파일의 가치가있는 중첩 된 디렉토리를 많이 읽었으므로 약 5 명마다 가로로 결합해야하며 5 개의 각 그룹을 수직으로 결합해야하는 데이터 프레임 목록이 있습니다.행을 복제하지 않고 데이터 프레임을 병합하지 않고 R

예제를 제공하려고합니다 (단순화를 위해 그룹 크기를 3로 줄임).

df.list[1]: 
id  Date  col1  col2 
1  date1 <int> <int> 
2  date1 <int> <int> 
3  date1 <int> <int> 

df.list[2]: 
id  Date  col3  col4 
1  date1 <int> <int> 
2  date1 <int> <int> 
3  date1 <int> <int> 

df.list[3]: 
id  Date  col5  col6 
1  date1 <int> <int> 
2  date1 <int> <int> 
3  date1 <int> <int> 

는 다음 몇은 ...

df.list[4]: 
id  Date  col1  col2 
1  date2 <int> <int> 
2  date2 <int> <int> 
3  date2 <int> <int> 

df.list[5]: 
id  Date  col3  col4 
1  date2 <int> <int> 
2  date2 <int> <int> 
3  date2 <int> <int> 

df.list[6]: 
id  Date  col5  col6 
1  date2 <int> <int> 
2  date2 <int> <int> 
3  date2 <int> <int> 

다른 샘플이며,이 몇 천 샘플가는 유지합니다. 나는 dplyr에서 bind_rows()를 사용하여 시도 적이 있지만 그 수율 :

이 세상의 종말이 아니라 그것을 할 필요가 같은 파일 크기가 5 배 큰
id  Date  col1  col2  col3  col4  col5  col6 
1  date1 <int> <int>  NA  NA  NA  NA 
2  date1 <int> <int>  NA  NA  NA  NA 
3  date1 <int> <int>  NA  NA  NA  NA 
1  date1  NA  NA <int> <int>  NA  NA 
2  date1  NA  NA <int> <int>  NA  NA 
3  date1  NA  NA <int> <int>  NA  NA 
1  date1  NA  NA  NA  NA  <int> <int> 
2  date1  NA  NA  NA  NA  <int> <int> 
3  date1  NA  NA  NA  NA  <int> <int> 
1  date2 <int> <int>  NA  NA  NA  NA 
2  date2 <int> <int>  NA  NA  NA  NA 
3  date2 <int> <int>  NA  NA  NA  NA 
1  date2  NA  NA <int> <int>  NA  NA 
2  date2  NA  NA <int> <int>  NA  NA 
3  date2  NA  NA <int> <int>  NA  NA 
1  date2  NA  NA  NA  NA  <int> <int> 
2  date2  NA  NA  NA  NA  <int> <int> 
3  date2  NA  NA  NA  NA  <int> <int> 

. 이상적으로 데이터는 다음과 같이 구성됩니다.

id  Date  col1  col2  col3  col4  col5  col6 
1  date1 <int> <int> <int> <int> <int> <int> 
2  date1 <int> <int> <int> <int> <int> <int> 
3  date1 <int> <int> <int> <int> <int> <int> 
1  date2 <int> <int> <int> <int> <int> <int> 
2  date2 <int> <int> <int> <int> <int> <int> 
3  date2 <int> <int> <int> <int> <int> <int> 

도움 주셔서 감사합니다.

답변

0

난 당신이 tidyverse으로 찾고있는 생각 :

library(tidyverse) 

ex_list <- list(df1, df2, df3, df4) 

ex_list %>% 
    bind_rows() %>% 
    gather(measure, value, col1:col4) %>% 
    na.omit() %>% 
    spread(measure, value) %>% 
    arrange(date) 


# A tibble: 6 x 6 
    id  date col1 col2 col3 col4 
    <dbl>  <date> <dbl> <dbl> <dbl> <dbl> 
1  1 2017-01-01  1  4  7 10 
2  2 2017-01-01  2  5  8 11 
3  3 2017-01-01  3  6  9 12 
4  1 2017-01-02 11 14 21 24 
5  2 2017-01-02 12 15 22 25 
6  3 2017-01-02 13 16 23 26 

데이터 : 입력에 대한

df1 <- tibble(
     id = c(1,2,3), 
     date = as.Date(c("2017-01-01", "2017-01-01", "2017-01-01")), 
     col1 = c(1, 2, 3), 
     col2 = c(4, 5, 6) 
    ) 

    df2 <- tibble(
     id = c(1,2,3), 
     date = as.Date(c("2017-01-01", "2017-01-01", "2017-01-01")), 
     col3 = c(7, 8, 9), 
     col4 = c(10, 11, 12) 
    ) 

    df3 <- tibble(
     id = c(1,2,3), 
     date = as.Date(c("2017-01-02", "2017-01-02", "2017-01-02")), 
     col1 = c(11, 12, 13), 
     col2 = c(14, 15, 16) 
    ) 

    df4 <- tibble(
     id = c(1,2,3), 
     date = as.Date(c("2017-01-02", "2017-01-02", "2017-01-02")), 
     col3 = c(21, 22, 23), 
     col4 = c(24, 25, 26) 
    ) 
+0

이 방법이 효과적이라고 생각하지만 너무 많은 메모리가 필요하므로 불행히도 사용할 수 없습니다. – pariscraigm

+0

약간의 수정이 이루어졌습니다. 나는 또한 측정 값으로 그룹화 한 다음 돌연변이 ID를 추가해야 했습니까? 또한 데이터를 청크로 분할해야했습니다. 나는 돌연변이 ID가 무엇인지 모르겠다. – pariscraigm

0

첫 번째 그룹에서 병합 기능을 먼저 사용해야하며 데이터 프레임을 다시 바인딩 할 수 있습니다. data.table 라이브러리를 사용 , 그것은 매우 효율적입니다 :

Reduce(merge,df.list[1:3]) 

id Date col1 col2 col3 col4 col5 col6 
1: 1 date1 <int> <int> <int> <int> <int> <int> 
2: 2 date1 <int> <int> <int> <int> <int> <int> 
3: 3 date1 <int> <int> <int> <int> <int> <int> 

이 그럼 당신은 lapply로의 목록을 작성하고, 그 목록에 rbind을 적용 할 필요가 병합 된 dataframe 줄 것이다

do.call("rbind",lapply(list(c(1:3),c(4:6)),function(x){Reduce(merge,df.list[x])})) 

    id Date col1 col2 col3 col4 col5 col6 
1: 1 date1 <int> <int> <int> <int> <int> <int> 
2: 2 date1 <int> <int> <int> <int> <int> <int> 
3: 3 date1 <int> <int> <int> <int> <int> <int> 
4: 1 date2 <int> <int> <int> <int> <int> <int> 
5: 2 date2 <int> <int> <int> <int> <int> <int> 
6: 3 date2 <int> <int> <int> <int> <int> <int> 

데이터 :

library(data.table) 
df.list <- list() 

df.list[[1]] <- setDT(read.table(text = 
" id  Date  col1  col2 
    1  date1 <int> <int> 
    2  date1 <int> <int> 
    3  date1 <int> <int>", 
header = TRUE, stringsAsFactors = FALSE)) 

df.list[[2]] <- setDT(read.table(text = 
" id  Date  col3  col4 
    1  date1 <int> <int> 
    2  date1 <int> <int> 
    3  date1 <int> <int>", 
header = TRUE, stringsAsFactors = FALSE)) 

df.list[[3]] <- setDT(read.table(text = 
" id  Date  col5  col6 
1  date1 <int> <int> 
2  date1 <int> <int> 
3  date1 <int> <int>", 
header = TRUE, stringsAsFactors = FALSE)) 


df.list[[4]] <- setDT(read.table(text = 
" id  Date  col1  col2 
    1  date2 <int> <int> 
    2  date2 <int> <int> 
    3  date2 <int> <int>", 
    header = TRUE, stringsAsFactors = FALSE)) 

df.list[[5]] <- setDT(read.table(text = 
    " id  Date  col3  col4 
    1  date2 <int> <int> 
    2  date2 <int> <int> 
    3  date2 <int> <int>", 
    header = TRUE, stringsAsFactors = FALSE)) 

df.list[[6]] <- setDT(read.table(text = 
    " id  Date  col5  col6 
    1  date2 <int> <int> 
    2  date2 <int> <int> 
    3  date2 <int> <int>", 
    header = TRUE, stringsAsFactors = FALSE)) 
여기 3,691,363,210
+0

감사합니다. 모든 그룹이 동일한 크기는 아니지만. 크기는 4에서 6입니다. 어떻게 든 날짜와 ID를 기반으로 바인딩해야합니다. – pariscraigm

+0

그룹별로 무슨 뜻인지 잘 모르겠습니다. 병합하고자하는 데이터 프레임의 수를 의미하는 경우 lapply (예제 (c (1 : 3), c (4 : 6) 목록)에 전달하는 벡터로 정의합니다. 첫 번째 그룹의 숫자가 4이고 두 번째 그룹의 숫자가 6이면 목록 (c (1 : 4), c (5:11))이 작업을 수행해야합니다. 내가 무슨 뜻인지 잘못 이해했다면, 현실적인 예를 들어주는 예제를 수정 해보십시오. – denis

+0

수천 개의 데이터 프레임이 있기 때문에 현실적인 예제를 제시하는 것은 불가능합니다. 내가 할 수있는 한 최선을 다해 설명했지만, 단지 두 개 이상의 그룹이 있고, 지나치게 지루한 수를 수동으로 두는 것이 훨씬 쉽습니다. 지금까지 작동중인 해결책을 발견하고 업데이트하려고합니다. – pariscraigm