将dplyr函数应用于30个数据帧中的一个公共列

时间:2017-07-18 18:54:45

标签: r function dplyr apply anti-join

我有多达30个带有公共ID列的数据框。每个df中还有其他列,但我只是在这里显示ID。

Library      DF1         DF2      DF3

ID#          ID#         ID#      ....
1111         1111        1112     ....
2222         1111        3333     ....
3333         3333        3333     ....
4444         2222        4444     ....

我必须将每个表中的ID#colum与库ID colum进行比较,以确保Id编号与库中的ID编号匹配。

目前我使用dplyr并做...

DF1 %>%
      anti_join(library, by = 'ID#') 

并且每个表都相同。它只会返回不在库中的任何ID号,我为每个数据表执行相同的命令,但是想为所有30个表运行它。我把所有的DF放在一个列表中,但我不确定如何继续,for循环?应用?任何帮助将不胜感激,因为这推动了我对R知识的界限。

1 个答案:

答案 0 :(得分:4)

您可以使用purrr迭代data.frame列表。下面是一个使用3 data.frame来提取与参考1不常见的ID的示例。

您可以在map_*函数中使用任何map_*函数最适合您想要的任何函数

请参阅purrr website了解详情


library(dplyr)
#> 
#> Attachement du package : 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
set.seed(999)
df_library <- data_frame(ID = sort(sample(1:12, 10)))
df1 <- data_frame(ID = sort(sample(1:12, 10)))
df2 <- data_frame(ID = sort(sample(1:12, 10)))
df3 <- data_frame(ID = sort(sample(1:12, 10)))


library(purrr)
#> 
#> Attachement du package : 'purrr'
#> The following objects are masked from 'package:dplyr':
#> 
#>     contains, order_by

list(df1 = df1, df2 = df2, df3 = df3) %>%
  map_df(~ anti_join(.x, df_library, by = "ID"), .id = "df_name")
#> # A tibble: 4 x 2
#>   df_name    ID
#>     <chr> <int>
#> 1     df1    12
#> 2     df2    12
#> 3     df3     3
#> 4     df3    12