较长的对象长度不是较短对象长度的倍数,使用 case_when 进行日期整理

问题描述 投票:0回答:1

我有一个虚拟数据集,如下。

my_data <- data.frame(date = as.Date(c("2022-03-08","2023-03-07","2022-11-29","2024-02-22")),
                      value = 1:4)

我有两个日期向量,如下:

tox_date_1q <- as.Date(c("2022-03-08","2023-03-07","2024-02-21"))

tox_date_3q <- as.Date(c("2022-06-21","2022-09-14","2022-11-29","2023-06-05","2023-09-13","2023-11-14"))

我想创建一列

group
,并使用以下标签之一对每一行进行分类。

c("tox_date_1q", "tox_date_3q", "tox_period_1q", "tox_period_3q", "others")

我的代码如下:

my_data <- my_data |>
  mutate(group = case_when(
    date %in% tox_date_1q ~ "tox_date_1q",
    date %in% tox_date_3q ~ "tox_date_3q",
    date > as.Date(tox_date_1q-30) & date < as.Date(tox_date_1q+30) ~ "tox_period_1q",
    date > as.Date(tox_date_3q-30) & date < as.Date(tox_date_3q+30) ~ "tox_period_3q",
    .default = "other"
  ))

我收到一条警告消息:

Warning message:
There were 4 warnings in `mutate()`.
The first warning was:
ℹ In argument: `group = case_when(...)`.
Caused by warning in `>.default`:
! longer object length is not a multiple of shorter object length

以下代码有问题,但我不知道如何修复。

date > as.Date(tox_date_1q-30) & date < as.Date(tox_date_1q+30) ~ "tox_period_1q",
date > as.Date(tox_date_3q-30) & date < as.Date(tox_date_3q+30) ~ "tox_period_3q",
r
1个回答
0
投票

也许您想测试 date 是否大于和小于所有

tox_date_1q - 30
tox_date_1q + 30

library(dplyr)
library(purrr)

my_data %>% 
  mutate(group = case_when(
           date %in% tox_date_1q ~ "tox_date_1q", 
           date %in% tox_date_3q ~ "tox_date_3q", 
           map_vec(date, ~ all(.x > tox_date_1q-30) & 
                           all(.x < tox_date_1q+30)) ~ "tox_period_1q", 
           map_vec(date, ~ all(.x > tox_date_3q-30) & 
                           all(.x < tox_date_3q+30)) ~ "tox_period_3q", 
           .default = "other"))
        date value       group
1 2022-03-08     1 tox_date_1q
2 2023-03-07     2 tox_date_1q
3 2022-11-29     3 tox_date_3q
4 2024-02-22     4       other
© www.soinside.com 2019 - 2024. All rights reserved.