首页 > 解决方案 > 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定义的每个groupa :stagebegend

|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的值添加df1stagefrom 。df2grouptime

期望的输出:

|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.

我想我的策略不正确,但我被困在这里。

标签: r

解决方案


您可以使用fuzzyjoin包:

fuzzyjoin::fuzzy_left_join(df1, df2, 
                           by = c('group', 'time' = 'beg', 'time' = 'end'), 
                           match_fun = c(`==`, `>=`, `<=`))

推荐阅读