R语言 根据另一个可能缺失的值获取最大值

ukxgm1gy  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(186)

我想获取组中另一列具有特定值的最大日期。在特定示例中,我想提取group中所有日期的最大值date,其中status == "inactive"。如果没有status==inactive的日期,则应返回NA。
我得到了下面的代码工作,但也得到了一个警告消息,我不完全理解为什么:

# Create sample data
df <- data.frame(
  group = c("A", "A", "B", "B"),
  date = as.Date(c("2022-01-01", "2022-02-01", "2022-03-01", "2022-04-01")),
  status = c("active", "inactive", "active", "active")
)

# Mutate data to get maximum date by group for rows where status is "inactive" 
df %>%
  group_by(group) %>%
  mutate(max_date = max(date[status=="inactive"]))

df %>%
  group_by(group) %>%
  mutate(max_date = dplyr::if_else(any(status=="inactive"),
                       max(date[status=="inactive"]),
                       NA_Date_))

这将返回以下警告消息:

Problem while computing `max_date = dplyr::if_else(...)`.
ℹ no non-missing arguments to max; returning -Inf
ℹ The warning occurred in group 2: group = "B".

第二种方法正确地返回NA值,但是为什么我会得到警告消息,因为max(date)-函数只应该在满足if_else语句的条件时使用/执行?当然我可以静音或忽略警告。

iq0todco

iq0todco1#

使用if/else可以使它工作。if_else在评估condition之前评估truefalse(如Darren Tsai所解释的),这解释了为什么会收到警告。

df %>%
  group_by(group) %>%
  mutate(max_date = if(any(status == "inactive")) max(date[status=="inactive"]) else NA)

  group date       status   max_date  
  <chr> <date>     <chr>    <date>    
1 A     2022-01-01 active   2022-02-01
2 A     2022-02-01 inactive 2022-02-01
3 B     2022-03-01 active   NA        
4 B     2022-04-01 active   NA
ldioqlga

ldioqlga2#

使用fmax

library(collapse)
library(dplyr)
 df %>%
   mutate(max_date = fmax(date[status == "inactive"])[1], .by = 'group')
  • 输出
group       date   status   max_date
1     A 2022-01-01   active 2022-02-01
2     A 2022-02-01 inactive 2022-02-01
3     B 2022-03-01   active       <NA>
4     B 2022-04-01   active       <NA>

相关问题