【问题标题】:Constructing a new variable in R using Case when在 R 中使用 Case when 构造一个新变量
【发布时间】:2021-01-16 10:21:34
【问题描述】:

试图构造一个新的变量,大小类。尺寸等级将基于使用以下结构的就业

     Sizeclass        Employment Range
         1                    1-9
         2                    10-99
         3                    100-499
         4                    500-999

这是一个样本数据集

      acct        Employment
        1             4
        2             12
        3             1
        4             54
        5             234
        6             13
        7             654
        8             101

到目前为止,这是我正在尝试使用的代码

            sizeclass %>%
            select(uiacct, naics, employment) %>%
            mutate(sizeclass = case_when (employment >=1 and employment <9 ~ "1",)
            employment >=10 and employment<=99 ~ "2"))

搜索了互联网,但几乎没有找到结合 Case_when、mutate 和不等式的内容。我知道不等式设置不正确。我的主要问题是这是否是创建这个新变量的正确结构?

注意:所有三个答案都有效。这个网站在 R

方面的帮助真是令人惊讶

【问题讨论】:

    标签: r variables dplyr case-when


    【解决方案1】:

    我喜欢使用between() 来处理双向不等式以提供更整洁的代码:

    library(tidyverse)
    
    sizeclass %>%
         select(uiacct, naics, employment) %>%
         mutate(sizeclass = case_when(between(employment, 1, 9) ~ 1,
                                      between(employment, 10, 99) ~ 2,
                                      between(employment, 100, 499) ~ 3,
                                      between(employment, 500, 999) ~ 4)) 
    

    注意,如果您将 sizeclass 值放在引号 "" 中,您将获得一个字符类型列。如果您想要一个数字列,只需使用数字即可。

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      df <- data.frame(
        acct = c(1:8),
        employment = c(4,12,1,54,234,13,654,101)
      )
      
      df <-  setDT(df)
      
      df <- df[,`:=`(
        Sizeclass = case_when(
          Employment >= 1 & Employment <= 9 ~ 1,
          Employment >= 10 & Employment <= 99 ~ 2,
          Employment >= 100 & Employment <= 499 ~ 3,
          Employment >= 500 & Employment <= 999 ~ 4
        )
      )]
      

      如果您的数据集是“数据框”,则首先将其转换为“数据表”

      【讨论】:

      • 我假设df项是数据框?
      • your_df 将您拥有的数据集,然后使用 'setDT()' 将其转换为数据表
      【解决方案3】:

      这是tidyverse 的答案。

      sizeclass <- data.frame(
        acct = c(1:8),
        employment = c(4,12,1,54,234,13,654,101)
      )
      
      library(tidyverse)
      
      df <- sizeclass %>%
        # select(uiacct, naics, employment) %>%
        mutate(sizeclass = case_when(
          employment %in% c(1:9) ~ "1",
          employment %in% c(10:99) ~ "2",
          employment %in% c(100:499) ~ "3",
          employment %in% c(500:999) ~ "4"))
      

      输出:

        acct employment sizeclass
      1    1          4         1
      2    2         12         2
      3    3          1         1
      4    4         54         2
      5    5        234         3
      6    6         13         2
      7    7        654         4
      8    8        101         3
      

      【讨论】:

        猜你喜欢
        • 2021-11-09
        • 1970-01-01
        • 2023-04-01
        • 2019-12-06
        • 2022-01-10
        • 2021-01-07
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多