使用 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_Type
和 Number_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 条件?