如果满足条件,则有条件地替换 group_by 的所有记录 dplyr ifelse

Conditionally replace all records for group_by if condition is met once dplyr ifelse

如果 id 一次或多次满足多个条件(我的 group_by()变量)。

这是我的数据示例:

  id         DATE       nat_locx  LOCX distance loc_age
 <fct>       <date>        <dbl> <dbl>    <dbl>   <dbl>
 6553        2004-06-27     13.5   2    487.90       26
 6553        2004-07-14     13.5  13.5    0          43
 6553        2004-07-15     13.5  12.5   30          44
 6553        2004-07-25     13.5  14.5   44.598      54
 6081        2004-07-05       13  14.2   40.249      44
 6081        2004-07-20       13  13.8   61.847      49

我尝试这样做的方式是这样的:

df<-df %>%
    group_by(id) %>%
    mutate(nat_locx=ifelse(loc_age>25 & loc_age<40 & distance>30, first(LOCX), nat_locx))

但是,当我这样做时,它只会用 LOCX 列的第一个值替换第一行,而不是 group_by 变量的所有 nat_locx 值(id).

理想情况下,我想要这样的输出:

  id         DATE       nat_locx  LOCX distance loc_age
 <fct>       <date>        <dbl> <dbl>    <dbl>   <dbl>
 6553        2004-06-27     2     2     487.90       26
 6553        2004-07-14     2     13.5    0          43
 6553        2004-07-15     2     12.5   30          44
 6553        2004-07-25     2     14.5   44.598      54 
 6081        2004-07-05     13    14.2   40.249      44
 6081        2004-07-20     13    13.8   61.847      49

首选 dplyr 解决方案。

我们可能需要replace

df %>%
    group_by(id) %>%
    mutate(nat_locx = 
       replace(nat_locx, 
       loc_age>25 & loc_age<40 & distance>30, 
       first(LOCX)))

我们可以使用经典的非向量化 if else 语句:

df %>%
  group_by(id) %>%
  mutate(nat_locx=if (loc_age > 25 & 
                      loc_age < 40 & 
                      distance > 30) {
    first(LOCX)
  } else {
    nat_locx
  }
  )
     id DATE       nat_locx  LOCX distance loc_age
  <int> <chr>         <dbl> <dbl>    <dbl>   <int>
1  6553 2004-06-27        2   2      488.       26
2  6553 2004-07-14        2  13.5      0        43
3  6553 2004-07-15        2  12.5     30        44
4  6553 2004-07-25        2  14.5     44.6      54
5  6081 2004-07-05       13  14.2     40.2      44
6  6081 2004-07-20       13  13.8     61.8      49