2017-12-26 16 views
0

私は約100個のデータセットを1つのデータセットにマージする必要があるので、多くのデータセットを一度にマージする方法を示す記事を見てきました(例えばherehere)、私の問題はユニークです。私の実世界のデータは私のハードドライブに保存され、同様の名前が付けられます(例えば、household2010household2011household2012person2010person2011は、person2012。彼らは、以下のグローバルenvironment.Exampleにロードする必要はありません。多くのペアのデータを別々のデータセットにまとめます

データを作業:

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" 
) 

私はperson2010household2010をマージし、hhperson2010と呼ばれる新しいデータセットを作成する必要があり、私はあまりにもhousehold2011person2011にこれを実行する必要が個別に私が行うことができます:。。

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。しかし、これは1つのデータセットを作成するので機能しません。別々のデータセットにマージするには、ペアにする必要があります。 – scottsmith

+0

吸いこんでやってみませんか?これらの100のテーブルはどこかから来ています。あなたはファイルからそれらをインポートしていますか?そこに 'lapply'して、決してメモリに100個の物を持ってはいけません。データの出所をもう少し考えてください。地球環境で100個の変数を避けるよりスマートな方法を提案することができます – dmi3kno

+0

ファイルはすべて私のハードドライブに保存されたRDataオブジェクトです(上記の私の例を編集してください)。地球環境にそれらを実際にロードせずにすべてを一度に行うことができれば、それは素晴らしいことです。 – scottsmith

答えて

1

たぶん、このような何か:あなたがもしあればループまたはlapply間の選択は、あなたのさらなる処理に応じて作ることができます

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 [[" householdYE "]]' – 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が目的を解決するだけだと思います。

+0

ありがとう@ Vishal786btcしかし、これは毎年手動で 'hhperson2010 = merge(x = df1、y = df2、by =" id "、all.x = TRUE)'を手動で行う必要があり、私は避けようとしていますそれ。 – scottsmith

+1

これはちょうどOPがほしいと思ってほしいです – PoGibas

+1

大丈夫です。それを指摘してくれてありがとう@PoGibas。あなたの答えは良く見えます。私は私のことを修正します。ありがとう。 – Vishal786btc

0

は、ここであなたは、あなたがそれで何をしたいかを決める

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 

私はtidyverseでそれを行うだろうかだとリストの列。 Rオブジェクトに書き戻すことができます(してください、代わりにRdsを使用してください)。あなたはそれを1つのテーブルに書き戻すことができます(私はそれが前進していくのがずっと簡単だと思います)。おそらくそれをjsonとしてエクスポートすることもできます。

関連する問題