【问题标题】:R - Lag function that skips over certain row?R - 跳过特定行的滞后函数?
【发布时间】:2022-06-10 23:54:22
【问题描述】:

我有一个如下所示的数据框:

 Park               Date                Coy_season AC_code Aggr_Code Presence    AC AC_conducted
  <chr>              <dttm>                   <dbl> <chr>   <chr>     <chr>    <dbl>        <dbl>
1 14st NE - Coventry 2019-01-30 00:00:00          1 3       1         1            0            0
2 14st NE - Coventry 2019-01-30 00:00:00          1 0       1         1            0            0
3 14st NE - Coventry 2019-01-30 00:00:00          1 4       1         1            0            0
4 14st NE - Coventry 2019-01-30 00:00:00          1 1       1         1            0            0
5 14st NE - Coventry 2019-02-01 00:00:00          1 4       1         1            3            1
6 14st NE - Coventry 2019-02-01 00:00:00          1 2       1         1            3            1

其中 AC_code 是治疗,从 0 到 6 不等,0 是控制。我想在这个数据框中添加一列“Last_Treatment”,这将表明每个公园的最后一次治疗(AC_code 的滞后)是什么,如果另一个治疗在事件之前不到 28 天并且最后一次治疗不是 0。如果最后一次治疗是 0,我希望它跳过那个 0 并寻找之前的治疗,除非在 28 天前没有进行其他治疗,在这种情况下,我希望它返回 NA。

除了跳过 0 值之外,我有以下代码几乎可以执行所有操作:

Coyote_presence_2 <- Coyote_presence_2 %>%
  group_by(Park) %>% 
  mutate(Last_Treatment = if_else((Date - lag(Date))<28*60*60*24, lag(AC_code), as.character(NA)))

我尝试了以下代码,但它返回错误:

Coyote_presence_2 <- Coyote_presence_2 %>%
      group_by(Park) %>% 
      mutate(Last_Treatment = if_else((Date - lag(Date))<28*60*60*24, lag(AC_code > 0), as.character(NA)))

Error: Problem with `mutate()` column `Last_Treatment`.
i `Last_Treatment = if_else(...)`.
x `false` must be a logical vector, not a character vector.
i The error occurred in group 1: Park = "14st NE - Coventry".
Backtrace:
  1. `%>%`(...)
  7. dplyr::if_else(...)
  8. dplyr:::replace_with(...)
  9. dplyr:::check_type(val, x, name)
 10. dplyr:::glubort(header, "must be {friendly_type_of(template)}, not {friendly_type_of(x)}.")

dplyr 解决方案是首选,但我会考虑其他建议!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    有一个NA 专用于character,即NA_character_

    Coyote_presence_2 %>%
      group_by(Park) %>% 
      mutate(Last_Treatment = if_else((Date - lag(Date))<28*60*60*24, lag(AC_code), NA_character_))
    

    【讨论】:

      猜你喜欢
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多