【问题标题】:If statement with employees data [duplicate]If语句与员工数据[重复]
【发布时间】:2020-07-11 13:05:59
【问题描述】:

我有一个数据集。其中包含有关公司员工的数据。您可以在下面看到数据:

#Data
 output_test<-data.frame(
                         Employees=c(1,2,3,10,15,122,143,150,250,300,500,1000)
                         )

所以下一个陡峭的应该是分类。我需要按公司规模对员工进行分类。规则是每个员工数量决定公司的规模。例如,如果数字低于 10,则表示“微型”公司,如果数字大于 10 但低于或等于 50公司是“小型”公司。对于“中型”公司,员工人数大于 50 但等于或小于 250 人,最后是“大型”公司,员工人数大于 250。 为了做到这一点,我用 IF else 语句编写了这行代码

# Code
library(dplyr)

    output_test_final<-output_test%>%
                       mutate( 
                      Size= if(Employees>=10){
                  "Micro"      
                } else {
                  if(Employees>=50){
                    "Small"
                  } else {
                if(Employees>=250){
                     "Medium"
                } else {
                  "Large"
                   }
                    }
                   }
              )

所以这段代码的结果不好。那么任何人都可以帮助我如何修复这段代码并获得如下表所示的表格吗?

【问题讨论】:

  • 试过case_when了吗?

标签: r if-statement dplyr


【解决方案1】:

if 用于标量输入,您可以使用ifelse,它可以用于向量,或者更好的是这里的case_when。另请注意,您的条件需要颠倒。

library(dplyr)

 output_test %>%
  mutate(Size = case_when(Employees <= 10 ~ "Micro", 
                          Employees <= 50 ~ "Small", 
                          Employees <= 250 ~ "Medium",
                          TRUE ~ "Large"))
#   Employees   Size
#1          1  Micro
#2          2  Micro
#3          3  Micro
#4         10  Micro
#5         15  Small
#6        122 Medium
#7        143 Medium
#8        150 Medium
#9        250 Medium
#10       300  Large
#11       500  Large
#12      1000  Large

另一种选择是使用cut 指定breakslabels

cut(output_test$Employees, breaks = c(-Inf, 10, 50, 250, Inf), 
          labels = c('Micro', 'Small', 'Medium', 'Large'))

【讨论】:

    【解决方案2】:

    试试这个:

    library(dplyr)
            output_test_final<-output_test%>%
                               mutate( 
                              Size= if(Employees<=10){
                          "Micro"      
                        } else {
                          if(Employees>=11 && Employees<=50){
                            "Small"
                          } else {
                        if(Employees>=51 && Employees<=250){
                             "Medium"
                        } else {
                          "Large"
                           }
                            }
                           }
                      )
    

    【讨论】:

      【解决方案3】:

      我们可以使用ifelse

      library(dplyr)
      output_test %>%
            mutate(Size = ifelse(Employees <= 10, "Micro", 
                            ifelse(Employees <= 50, "Small", 
                               ifelse(Employees <= 250, "Medium",
                                "Large"))))
      

      或者在base RfindInterval

      c('Micro', 'Small', 'Medium', 'Large')[findInterval(output_test$Employees, c(10, 50, 250)) + 1]
      #[1] "Micro"  "Micro"  "Micro"  "Small"  "Small"  "Medium" "Medium" "Medium" "Large"  "Large"  "Large"  "Large" 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 2015-02-16
        • 2017-08-20
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多