首页 > 解决方案 > 如何在r中的条件匹配中使用管道?

问题描述

我在尝试通过在条件语句中使用管道运算符根据 2nd df 中可用的国家/地区过滤 1st df 中的数据时遇到错误。

参考国家 df

Overall_top5

########### output ###########

continent country gdpPercap

Africa  Botswana    8090        
Africa  Equatorial Guinea   20500       
Africa  Gabon   19600       
Africa  Libya   12100       
Africa  Mauritius   10900       
Americas    Canada  51600       
Americas    Chile   15100       
Americas    Trinidad and Tobago 17100   

主df

gap_longer

########### output #############

country year gdpPercap continent

Australia   2019    57100   Oceania 
Botswana    2019    8090    Africa  
Canada  2019    51600   Americas    
Chile   2019    15100   Americas    
Denmark 2019    65100   Europe

错误:当我尝试下面的代码时,它给了我错误:

gap_longer %>% 
  filter(year == 2019,
         country %in% Overall_top5 %>% select(country) )

Error: Problem with `filter()` input `..1`. x no applicable method for 'select_' applied to an object of class "logical" i Input `..1` is `country %in% Overall_top5 %>% select(country)`. Run `rlang::last_error()` to see where the error occurred.

如何使用管道运行它?我可以使用 base R 运行它,但不知道如何使用管道修复它。

gap_longer %>% 
  filter(year == 2019,
         country %in% Overall_top5$country ) 


原始数据

Overall_top5 <- structure(list(continent = c("Africa", "Africa", "Africa", "Africa", "Africa", "Americas", "Americas", "Americas"), country = c("Botswana", "Equatorial Guinea", "Gabon", "Libya", "Mauritius", "Canada", "Chile", "Trinidad and Tobago"), gdpPercap = c(8090L, 20500L, 19600L, 12100L, 10900L, 51600L, 15100L, 17100L)), row.names = c(NA, -8L), class = "data.frame")
gap_longer <- structure(list(country = c("Australia", "Botswana", "Canada", "Chile", "Denmark"), year = c(2019L, 2019L, 2019L, 2019L, 2019L), gdpPercap = c(57100L, 8090L, 51600L, 15100L, 65100L), continent = c("Oceania", "Africa", "Americas", "Americas", "Europe")), class = "data.frame", row.names = c(NA, -5L))

标签: rtidyverse

解决方案


首先,您想使用pull而不是select返回select数据框而不是向量(但这并不能解决您的问题)。

您的问题来自优先级。在您的示例中,%in%首先评估,然后评估%>%. 要解决此问题,请使用括号。

gap_longer %>% 
  filter(
    year == 2019,
    country %in% (Overall_top5 %>% pull(country))
  )
#> # A tibble: 3 x 4
#>   country   year gdpPercap continent
#>   <chr>    <dbl>     <dbl> <chr>    
#> 1 Botswana  2019      8090 Africa   
#> 2 Canada    2019     51600 Americas 
#> 3 Chile     2019     15100 Americas 

推荐阅读