使用R时如何使用case_根据条件进行变异

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

我正在努力寻找一种根据条件创建新变量的方法。在本例中,我想基于名为“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"
    ))
  }
r case
1个回答
1
投票

这能给你你想要的吗?

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

© www.soinside.com 2019 - 2024. All rights reserved.