2017-12-26 24 views
0

나는 하나의 데이터 세트로 병합해야하는 약 100 개의 데이터 세트 쌍이 있습니다. 많은 데이터 세트를 한 번에 병합하는 방법을 보여주는 게시물을 보았습니다 (예 : herehere),하지만 내 문제는 고유합니다. 내 실제 데이터가 내 하드 드라이브에 저장되어있는 유사 이름이 지정됩니다 (예를 들어, household2010, household2011, household2012person2010, person2011person2012. 그들은 아래 글로벌 environment.Example에로드 할 필요가 없습니다.많은 데이터 쌍을 별도의 데이터 세트로 병합

근무 데이터 :.. 내가 hhperson2010 내가 너무 household2011person2011에이 작업을 수행 할 필요이라는 새 데이터 집합을 person2010household2010을 병합 만들 필요가

library(tidyverse) 

household2010 <- tribble(
~id, ~var2, ~var3, ~var4, ~var5, 
"1", "1", "1", "a", "d", 
"2", "2", "2", "b", "e", 
"3", "3", "3", "c", "f" 
) 

person2010 <- tribble(
~id, ~var6, ~var7, 
"1", "1", "1", 
"2", "2", "2", 
"3", "3", "3", 
"4", "4", "4" 
) 

household2011 <- tribble(
~id, ~var8, ~var9, ~var10, 
"1", "1", "1", "1", 
"2", "2", "2", "2", 
"3", "3", "3", "3", 
"4", "4", "4", "4" 
) 

person2011 <- tribble(
~id, ~var11, ~var12, ~var13, 
"1", "1", "1", "1", 
"2", "2", "2", "2", 
"3", "3", "3", "3", 
"4", "4", "4", "4", 
"5", "5", "5", "5" 
) 

는 개별적으로 내가 할 수있는 :

hhperson2010 <- left_join(household2010, person2010, by = "id") 

hhperson2011 <- left_join(household2011, person2011, by = "id") 

내가 100 개가 넘는 데이터 쌍을 가지고 있으면 어색해집니다. lapply을 사용하여 데이터 세트 목록을 검토하고 병합 할 수 있습니까? 같은 뭔가이 같은

dflist1 <- list(household2010, household2011) 

dflist2 <- list(person2011, person2011) 

lapply(function(x) left_join(dflist, dflist2, by = "id") 
+0

감사합니다. @ d.b.,하지만 하나의 데이터 세트를 만들 때이 기능이 작동하지 않습니다. 별도의 데이터 세트로 병합하려면 쌍이 필요합니다. – scottsmith

+0

흡입 할 때 왜 안합니까? 이 100 개의 테이블은 어딘가에서 왔습니다. 파일에서 가져 오는 중입니까? 거기에 'lapply'하고 100 개의 객체를 메모리에 두지 마십시오. 우리는 데이터 출처에 대해 좀 더 생각해보십시오. 그래서 우리는 지구 환경에서 100 가지 변수를 피하는 더 똑똑한 방법을 제안 할 수 있습니다. – dmi3kno

+0

파일은 내 하드 드라이브에 저장된 모든 RData 객체입니다 (위의 예에서 편집했습니다). 지구 환경에 실제로로드하지 않고 한꺼번에 처리 할 수 ​​있다면 좋을 것입니다. – scottsmith

답변

1

아마 뭔가 :

years <- 2010:2011 
result <- lapply(years, 
       function(x) left_join(get(paste0("household", x)), 
            get(paste0("person", x)), 
            "id")) 

names(result) <- paste0("household", years) 
+0

감사합니다 @PoGibas,하지만 빈 파일을 저장합니다. 나는'save' 명령이 여러분이 가지고있는 것과 같은 것을 받아 들일 수 있기를 바랍니다. 나는'RDS'보다는'Rdata'로 파일을 저장하는 것을 선호합니다. – scottsmith

+0

데이터 세트를 '저장'해야하는 필요성을 없앴습니다. – scottsmith

+0

@scottsmith 결과를 목록에 저장하고 원하는 이름으로 목록 항목의 이름을 지정하여 내 답변을 업데이트했습니다. 이리스트를 하나의 객체로 저장하거나'result [[ "householdYEAR"]]' – PoGibas

0
just an alternate solution: 
years <- c("2010", "2011", "2014") 

for (x in years){ 
    result <- merge(get(paste0("household", x)), get(paste0("person", x)), "id") 
    names <- paste0("household", x) 
    print(names) 
    print(result) 
} 

당신은 어떤 경우 lapply 루프 또는 사이에서 선택하여 추가 처리에 따라 만들 수 있습니다. 당신이 당신의 데이터 세트와 더 이상 관련이 없다면, 나는 lapply가 단지 목적을 해결할 것이라고 생각합니다. 여기

+0

감사합니다 @ Vishal786btc,하지만이 수동으로 할 필요가 여전히 수동으로 hhperson2010 = 병합 (x = df1, y = df2, by = "id", all.x = TRUE)'및 매년 피하려고합니다. 그. – scottsmith

+1

이것은 정확히 OP가 피하고 싶다 – PoGibas

+1

오케이. 그 점을 지적 해 주신 고마워요. 당신의 대답은 좋아 보인다. 나는 고칠거야. 감사. – Vishal786btc

0

내가 tidyverse와 함께 할 및 목록 - 열

library(dplyr) 
library(tidyr) 
library(purrr) 

env2listcol <- function(rdata_file) 
{ 
    e <- new.env() 
    load(rdata_file, envir = e) 
    # since you know that there's only 1 df in each environment 
    as.list.environment(e)[[1]] 
} 

# assuming files are stored in `input` folder 
dir("input", full.names = T) %>% as_tibble() %>% 
    # split the path 
    separate(value, into=c("dir", "file", "ext"), remove=FALSE) %>% 
    # get the category and the key in separate columns 
    extract(file, into=c("key", "year"), regex="([a-z]+)(\\d+)") %>% 
    # file path by category by year, remove unnecessary columns 
    spread(key, value) %>% select(-dir, -ext) %>% 
    # extract dataframes from environments, and join them 
    mutate(household=map(household, env2listcol), 
     person=map(person, env2listcol), 
     joined=map2(household, person, left_join)) %>% 
    # rbind joined tables, although you could pull(joined) or imap over it 
    unnest(joined) 

#> # A tibble: 7 x 14 
#> year id var2 var3 var4 var5 var6 var7 var8 var9 var10 var11 var12 var13 
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
#> 1 2010  1  1  1  a  d  1  1 <NA> <NA> <NA> <NA> <NA> <NA> 
#> 2 2010  2  2  2  b  e  2  2 <NA> <NA> <NA> <NA> <NA> <NA> 
#> 3 2010  3  3  3  c  f  3  3 <NA> <NA> <NA> <NA> <NA> <NA> 
#> 4 2011  1 <NA> <NA> <NA> <NA> <NA> <NA>  1  1  1  1  1  1 
#> 5 2011  2 <NA> <NA> <NA> <NA> <NA> <NA>  2  2  2  2  2  2 
#> 6 2011  3 <NA> <NA> <NA> <NA> <NA> <NA>  3  3  3  3  3  3 
#> 7 2011  4 <NA> <NA> <NA> <NA> <NA> <NA>  4  4  4  4  4  4 

당신은 당신이 그것으로 수행 할 작업을 결정하는 것이 방법입니다. R 오브젝트에 다시 쓸 수 있습니다 (제발, 제발, Rds를 사용하십시오). 단일 테이블로 다시 작성할 수 있습니다 (앞으로 처리하기가 훨씬 쉽습니다). 아마 json으로 내보낼 수도 있습니다.