使用 Filter 或 If Else 根据 R 中另一列中的值过滤指标

Posted

技术标签:

【中文标题】使用 Filter 或 If Else 根据 R 中另一列中的值过滤指标【英文标题】:Using Filter or If Else to filter an indicator based on the value in another column in R 【发布时间】:2022-01-22 12:14:09 【问题描述】:

我有一个包含 4 个指标(国家、站点名称、年份、Test_type 和 Number_ofTests)的示例数据集。我的最终目标是拥有一个同时包含 test_types(Covid 和 Flu)的数据集,但仅适用于实际提供 Covid 测试的网站。

这意味着我需要所有提供 Covid 测试的网站,但需要过滤掉那些进行流感测试但没有 Covid 的网站。

我在弄清楚如何构建代码时遇到了问题,因为“Flu”和“Covid”都在同一列“Test_Type”下。

我尝试了这段代码,但最终从“Covid”中删除了缺失的内容并保留了所有不是我想要的“流感”。

master2 % 过滤器(Test_Type %in% c("Covid") %>% drop_na(Number_Tests)

进一步说明:代码应该删除站点 112 和 118,因为它们不提供 Covid 测试 (number_tests = 0),并且应该只为也提供 Covid 测试的站点保留流感变量。请注意:某些站点名称确实会在数据集中进一步重复

为了清楚起见,链接到数据集结构的图片:

【问题讨论】:

缺少) filter 部分? master2 <- master1 %>% filter(Test_type == "Covid") %>% drop_na(Number_ofTests) 我在实际代码中有这个——只是忘了写在这里 根据您的屏幕截图和代码,Test_TypeNumber_Tests 的列名都有错误 如果您只需要选择Covid并从数据中删除112和118,请尝试master1 %>% filter(Test_Type == "Covid", Number_Tests > 0) 问题是我需要根据 Covid 的值是否 > 0 来过滤掉流感。这有意义吗?我可以进一步澄清 【参考方案1】:

我会为此使用过滤连接。这个想法是过滤数据集以返回所有提供 Covid 测试的站点。然后我们可以使用过滤连接,例如dplyr 中的semi_join()。以下是它的工作原理:

master1 %>% 
  semi_join(
    master1 %>%
      filter(Test_Type == "Covid") %>%
      select(-Test_Type, -Number_Tests) %>%
      distinct()
   )

semi_join() 函数返回第一组中与第二组匹配的所有行。第二组被过滤到仅提供 Covid 测试的不同站点。

【讨论】:

以上是关于使用 Filter 或 If Else 根据 R 中另一列中的值过滤指标的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 dplyr::if_else() 根据另一个变量的值更改 POSIXct 时间戳的时区

如何向已包含 .map 和 .filter 的箭头函数添加 if 、 else if 和 else 条件?

根据if else(或switch)c#声明不同对象类型的2D数组

R中的多个if else语句[重复]

R语言 决策

v-if,v-else,v-else-if的使用