有条件替换Group_by的所有记录,如果满足条件,一旦达到条件

发布于 2025-01-17 23:46:00 字数 1553 浏览 1 评论 0原文

我正在尝试将nat_locx中的所有值替换为locx中的第一行的值,如果id> 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列而不是第一个值代替第一行所有nat_locx我的group_by variable(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解决方案是首选。

I am trying to replace all values in nat_locx with the value from the first row in LOCX if multiple conditions are met once or more for id (my group_by() variable).

Here is an example of my data:

  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

The way I have tried to do this is like so:

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

However, when I do this, it only replaces the first row with the first value from the LOCX column instead of all the nat_locx values for my group_by variable (id).

Ideally, I'd like this output:

  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

A dplyr solution is preferred.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南风几经秋 2025-01-24 23:46:00

如果 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

We could use a classic non vectorized if else statement:

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
拥抱我好吗 2025-01-24 23:46:00

我们可能需要更换

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

We may need replace

df %>%
    group_by(id) %>%
    mutate(nat_locx = 
       replace(nat_locx, 
       loc_age>25 & loc_age<40 & distance>30, 
       first(LOCX)))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文