我正在努力寻找一种根据条件创建新变量的方法。在本例中,我想基于名为“number”的变量创建一个名为“size”的变量,但“size”的规则根据名为“type”的变量而不同。因此,当“number”为 1 时,应应用一组 case_when 规则,当“number”为 2 时,应应用另一组 case_whn 规则。
# Load libraries
library(tidyverse)
# Create data
dat <- tribble(
~number, ~type,
232, 1,
383, 2,
832, 1,
722, 2,
134, 1,
211, 2,
970, 1
)
# This works
dat |> mutate(size = case_when(
number > 400 ~ "big",
number < 400 ~ "medium",
number < 200 ~ "small"
))
# This also works
dat |> mutate(impression = case_when(
number > 700 ~ "super big",
between(number, 400, 700) ~ "quite medium",
number < 400 ~ "quite small"
))
# I would like do this, but it doesn't work
dat %>%
if (type == 1) {
mutate(size = case_when(
number > 400 ~ "big",
number < 400 ~ "medium",
number < 200 ~ "small"
))
} else {
mutate(impression = case_when(
number > 700 ~ "super big",
between(number, 400, 700) ~ "quite medium",
number < 400 ~ "quite small"
))
}
这能给你你想要的吗?
dat %>%
mutate(
size = ifelse(
type == 1,
case_when(
number > 400 ~ "big",
number < 400 ~ "medium",
number < 200 ~ "small"
),
NA
),
impression = ifelse(
type == 1,
NA,
case_when(
number > 700 ~ "super big",
between(number, 400, 700) ~ "quite medium",
number < 400 ~ "quite small"
)
)
)
# A tibble: 7 × 4
number type size impression
<dbl> <dbl> <chr> <chr>
1 232 1 medium NA
2 383 2 NA quite small
3 832 1 big NA
4 722 2 NA super big
5 134 1 medium NA
6 211 2 NA quite small
7 970 1 big NA
本质上,是使用
ifelse
而不是 if ... else
,并将其放置在 mutate
调用的 inside 而不是 outside。