r - 使用 dplyr 根据不同数据框中的条件过滤行数据框
问题描述
我有两个数据框:df1 和 df2(参见下面的示例)。df1 包含每个字符 id 的数字开始和结束值。df2 每个字符 id 包含多个事件,包括数字时间值。
library(dplyr)
df1 <- data_frame(id = c("A", "B"),
start = c(2, 3),
end = c(5, 9))
df2 <- data_frame(id = c(rep("A", 4), rep("B", 4)),
time = c(1, 3, 5, 8, 2, 3, 4, 10),
keep = c(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE))
我正在尝试使用 dplyr 过滤 df2 中的事件,该时间值等于或介于 df1 中每个 id 的开始值和结束值之间。所以过滤器是 "df2$time >= df1$start & df2$time <= df1$end" 应该为每个 id 分别执行。我添加了一个逻辑列“keep”来显示我想在 df2 中保留哪些行。
如何为每个 id 执行此过滤器?最好使用 dplyr。这应该是最终结果:
df2 %>%
filter(keep == TRUE)
任何帮助深表感谢!
解决方案
像这样的东西呢,有dplyr
:
df1 %>%
left_join(df2) %>% #joining to have one dataset
filter(time <= end, time >= start) %>% # filter, you can use <, > in case
select(-c(2,3)) # remove useless column if necessary
# A tibble: 4 x 3
id time keep
<chr> <dbl> <lgl>
1 A 3 TRUE
2 A 5 TRUE
3 B 3 TRUE
4 B 4 TRUE
推荐阅读
- javascript - e.PreventDefault() 未按预期触发,表单提交
- c# - 在 Xamarin Forms 中添加新的“注释”时如何将 SwipeView 添加到 CollectionView
- android - 在Android中覆盖文件磁盘集群
- dpdk - dpdk 20.11 中的接口或端口 ID 到 IP 地址
- codeigniter - Codeigniter 3中的表单验证使用不同的数据库
- spring-boot - 带有 mapstruct\lombok 和 swagger2 的 spring-boot 2.5.2(mapstruct 不起作用)
- mysql - MYSQL命令行,导入命令覆盖当前数据库?
- angular - 如何在 Angular 9 中更改 ngx-daterangepicker-material daterangepicker 的时区?
- flutter - 谷歌地图实现与颤振 2 和 nullsafety
- reactjs - CSSTransition 不适用于条纹元素 React