r - R:根据其他数据框动态定义值范围
问题描述
我有两个数据框,一个 ( df1
) 的样本由group
和组织time
:
|sample |group | time|
|:------|:-----|----:|
|Oct |B | 10|
|Feb |A | 15|
|Nov |A | 7|
|May |A | 5|
|Jun |A | 0|
|Mar |C | 12|
另一个 ( ) 定义了由开始 ( ) 和结束 ( ) 时间df2
定义的每个group
a :stage
beg
end
|group |stage | beg| end|
|:-----|:-----|---:|---:|
|A |I | 4| 8|
|A |II | 9| 12|
|A |III | 13| 20|
|B |I | 3| 12|
|B |II | 13| 18|
|B |III | 19| 21|
|C |I | 2| 6|
|C |II | 7| 12|
|C |III | 13| 17|
我想要的是根据and的值添加df1
到stage
from 。df2
group
time
期望的输出:
|sample |group | time|stage|
|:------|:-----|----:|----:|
|Oct |B | 10| I|
|Feb |A | 15| III|
|Nov |A | 7| I|
|May |A | 5| I|
|Jun |A | 0| I|
|Mar |C | 12| II|
我尝试过的是使用mutate
+case_when()
并动态定义我正在测试的值的范围time
:
df1 <- df1 %>%
mutate(stage = case_when(time %in% df2[df2$stage=='I'& df2$group==group, 3]:df2[df2$stage=='I'& df2$group==group, 4] ~ 'I',
time %in% df2[df2$stage=='II'& df2$group==group, 3]:df2[df2$stage=='II'& df2$group==group, 4] ~ 'II',
time %in% df2[df2$stage=='III'& df2$group==group, 3]:df2[df2$stage=='III'& df2$group==group, 4] ~ 'III'))
这是行不通的。问题是,我怀疑,df2$group==group
.
我想我的策略不正确,但我被困在这里。
解决方案
您可以使用fuzzyjoin
包:
fuzzyjoin::fuzzy_left_join(df1, df2,
by = c('group', 'time' = 'beg', 'time' = 'end'),
match_fun = c(`==`, `>=`, `<=`))
推荐阅读
- c# - Xml 解析并绑定到 xamarin 表单上的列表视图
- angular - 是否可以在我的平台/主应用程序中包含 Angular 7 打包模块,该模块位于 Angular 6 中(也有其他具有 Angular 6 的应用程序)
- javascript - 如何在vue js中重新分配浏览器中的按钮?
- apache-nifi - MiNiFi:显示目录的 ListFile 处理器无效,因为目录不存在
- java - 我正在尝试使用准备好的语句执行 sql 查询,但它返回空值
- document - 网络上缺少 Indy 文档
- sphinx - 什么是斯芬克斯搜索中的旋转和不旋转
- android - 如何从 PackageInstaller 获取侧载 APK 的签名
- reactjs - 如何在反应中检查输入字段的类型?
- ruby-on-rails - 如何使用清除库覆盖rails中的url_after_denied_access_when_signed_out方法来更改重定向url?