PurrrのPmapとDplyrのSemi_Joinで2つのマスターデータフレームを使用して複数のデータフレームをフィルタリングする方法

マイク
 library(tidyverse)

以下のサンプルデータセット(201603用に3つ、201602用に3つ)を使用して、dplyr :: semi_join、purrr :: map2、purrr ::などの整頓されたツールを使用して、2つのマスターデータセットを使用して他のいくつかのデータセットをフィルタリングしようとしています。 pmap。フィルタリングされたデータのリストを出力にしたいと思います。しかし、pmap()を使用してこれらすべてを1セットのコードで実行しようとしているときに行き詰まり、フィルタリングされたすべてのデータの1つのリストを出力できるようになりました。

この例は少し複雑なので、分解してみます。まず、このコードを使用して、フィルタリングが必要な2つの「201603」データセットを「List1」というリストに配置しました。次に、purrr :: mapを使用してId列名を変更し、後でsemi_joinを使用できるようにしました。

List1<-list(One201603,Two201603)%>%
map(~rename(.x,"Id"="ID"))

次に、purrr :: map2を使用してList1を反復処理し、MainData201603のリストを使用しました。これは、他の2つのデータセットをフィルタリングするために使用されている201603のマスターデータセットです。これによりリストが出力され、リスト要素名をpurrr :: set_namesで変更します。

Df<-map2(List1,list(MainData201603),semi_join,by="Id")%>%
set_names(c("One201603","Two201603"))

ここまではすべて機能しますが、「MainData201602」という別のマスターデータセットと、フィルタリングが必要な他の2つのデータセット「One201602」と「Two201602」があります。上記と同じ手順を実行することもできますが、コードを繰り返したくないので、pmap()などのpurrrツールを使用してすべてを1つの手順で実行するよりエレガントな方法があると感じています。私は以下のコードのようなものを考えていますが、それは機能しません。pmapとリストの他のいくつかのバリエーションを試しましたが、理解できませんでした。助けていただければ幸いです!

List2<-list(One201602,Two201602)%>%
map(~rename(.x,"Id"="ID"))

 Df<-pmap(list(List1,list(KPI201603)),list(List2,list(KPI201602)),semi_join,by="Id")%>%
map(~set_names(.x,c("One201603","Two201603","One201602","Two201602")))



Id<-c(6666,3333,1111,9999,8888,5555,2222,4444)
Animal<-c("Rabbit", "Moose", "Dog", "Cat", "Squirrel", "Raccoon", "Fish", "Elephant")
MainData201603<-data_frame(Id,Animal)

ID<-c(6666,3333,4545,6767,3322,1111,8888,8876,9990,1234,7775,3445)
Person<-c("Chris","Yuki","Mike","Darren","Katrina","Camilla","Dreanna","Nathan","Aisha","Sra","Pierre","Luigi")
One201603<-data_frame(ID,Person)

ID<-c(6666,8888,4453,1243,1111,5567,4543,8898,4444,7665,7889,5554)
Person<-c("Mr.K","Ms.S","Mr.P","Mr.B","Mrs.N","Mrs.W","Mr.D","Ms.A","Ms.M","Mr.X","Mrs.Z","Ms.T")
Two201603<-data_frame(ID,Person) 

MainData201602<-MainData201603

One201602<-One201603

Two201602<-Two201603
www

これが可能な解決策です。アイデアは、作成することですList1し、List2適切な名前を持ちます。そして呼ばリスト作成target含有した、List1List2、と呼ばれるリストmaster含む、list(MainData201603)list(MainData201602)その後、我々は使用することができますmap2適用するmap2あなたが開発した機能targetとをmaster

List1 <- list(One201603,Two201603)%>%
  map(~rename(.x,"Id"="ID")) %>%
  set_names(c("One201603","Two201603"))

List2 <- list(One201602,Two201602)%>%
  map(~rename(.x,"Id"="ID")) %>%
  set_names(c("One201602","Two201602"))

target <- list(List1, List2)
master <- list(list(MainData201603), list(MainData201602))

map2(target, master, ~map2(.x, .y, semi_join, by = "Id"))
[[1]]
[[1]]$One201603
# A tibble: 4 x 2
     Id Person 
  <dbl> <chr>  
1  6666 Chris  
2  3333 Yuki   
3  1111 Camilla
4  8888 Dreanna

[[1]]$Two201603
# A tibble: 4 x 2
     Id Person
  <dbl> <chr> 
1  6666 Mr.K  
2  8888 Ms.S  
3  1111 Mrs.N 
4  4444 Ms.M  


[[2]]
[[2]]$One201602
# A tibble: 4 x 2
     Id Person 
  <dbl> <chr>  
1  6666 Chris  
2  3333 Yuki   
3  1111 Camilla
4  8888 Dreanna

[[2]]$Two201602
# A tibble: 4 x 2
     Id Person
  <dbl> <chr> 
1  6666 Mr.K  
2  8888 Ms.S  
3  1111 Mrs.N 
4  4444 Ms.M  

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ