首页 > 解决方案 > if else 使用过滤器 R

问题描述

我有一个df:

df1 <- data.frame(
  sample_id = c('SB024', '3666-01', '3666-01', '3666-02'), 
  FAO = c(100,50,3,5) 

> df1
  sample_id FAO
1     SB024 100
2   3666-01  50
3   3666-01   3
4   3666-02   5

我想做一个像这样的过滤器:如果样本 id 包含 3666 过滤器 FAO >4,否则过滤 FAO >20

所以输出将是:

 sample_id FAO
1     SB024 100
2   3666-01  50
3   3666-02   5

在从此处阅读上一个问题后,我尝试了以下操作如何使用 dplyr 的 filter() 和 R-base 的 ifelse() 过滤数据框?

df1%>% 
+   filter(df1, str_detect(sample_id, "3666" & FAO >=4))

错误:filter()输入有问题..1。i 输入..1case。x 输入..1$sample_id必须是逻辑向量,而不是字符。

标签: r

解决方案


您的尝试非常接近,但似乎存在一些语法问题;这应该可以解决您的问题:

library(tidyverse)

df1 <- data.frame(
  sample_id = c('SB024', '3666-01', '3666-01', '3666-02'), 
  FAO = c(100,50,3,5)
)

df1 %>%
  filter(ifelse(str_detect(sample_id, "3666"), FAO >=4, FAO >20))
#>   sample_id FAO
#> 1     SB024 100
#> 2   3666-01  50
#> 3   3666-02   5

df1 %>%
  filter(ifelse(str_detect(sample_id, "XXXX"), FAO >=4, FAO >20))
#>   sample_id FAO
#> 1     SB024 100
#> 2   3666-01  50

reprex 包于 2021-11-05 创建(v2.0.1)


推荐阅读