`case_when` NA/NaN 使用变量生成基于范围的条件时

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

我正在尝试根据 mod 结果生成序列,该结果在由整数变量定义的范围内,

到目前为止我尝试过的所有方法都失败并出现此类错误消息:

case_when()
中的错误引起:
!无法计算公式 1 的左侧。
a:b
中的错误引起:! NA/NaN 参数

在变量连续的情况下,这种方法有效, 尽管有警告,除非我使用

dplyr::rowwise

library(dplyr)

df1 <- data.frame(cond = rep(c("a1", NA, "a1", NA), each = 20),
                  a = 1,
                  b = 3,
                  year = rep(1:20, 4),
                  freq = 5)

df1_new <-
  df1 |>
  rowwise() |>
  mutate(new_var = case_when(cond == "a1" & year %% 5 %in% a:b ~ 1,
                             TRUE ~ 0))

结果应该是这样的:

ggplot2::ggplot(df1_new, aes(year, new_var)) +
  ggplot2::geom_col()

但是我的数据实际上要复杂得多,在这种情况下 奇怪的是,这个数据框确实产生了所需的数据,而无需

rowwise
但使用
rowwise
会失败并显示上述错误消息。

df2 <- data.frame(cond = rep(c("a1", NA, "a1", NA), each = 20),
                  a = rep(c(1, NA_real_), each = 20),
                  b = rep(c(3, NA_real_), each = 20),
                  year = rep(1:20, 4),
                  freq = 5)


df2_new <-
   df2 |>
 rowwise() |>
  mutate(new_var = case_when(cond == "a1" & year %% 5 %in% a:b ~ 1,
                            TRUE ~ 0))

任何有关识别问题的帮助以及更好的编码方法的指导将不胜感激。并帮助了解这里发生了什么。

r dplyr case
1个回答
0
投票

还有另一种方法:

df1 |>
  mutate(new_var = !is.na(cond) & cond == "a1" & between(year %% 5, a, b))

# or, if you have more conditions you haven't shared with us:
df1 |>
  mutate(new_var = case_when(
    !is.na(cond) & cond == "a1" & between(year %% 5, a, b) ~ TRUE,
    TRUE ~ FALSE
  ))
© www.soinside.com 2019 - 2024. All rights reserved.