【问题标题】:Define levels as ranges in R [duplicate]将级别定义为R中的范围[重复]
【发布时间】:2025-11-22 08:15:03
【问题描述】:

我有一个温度值向量

temp <- c(2.6, 5.3, 4.6,9.8,9.4,14.1,16.2,16.4,11.6,8.0,3.0,5.0)

我试图为这个向量创建一个因子,定义为 3 个级别: 低于 5 (l),介于 5 和 15 (m) 之间,以及高于 15 (h)。 帮助表示赞赏。

【问题讨论】:

    标签: r


    【解决方案1】:

    我建议使用cut() 函数,然后您可以将结果存储在数据框中:

    #Data
    temp <- c(2.6, 5.3, 4.6,9.8,9.4,14.1,16.2,16.4,11.6,8.0,3.0,5.0)
    #Cut
    temp2 <- cut(temp,breaks = c(-Inf,5,15,Inf),labels = c('l','m','h'),include.lowest = T,right = F)
    #Dataframe
    df <- data.frame(temp,temp2)
    

    输出:

       temp temp2
    1   2.6     l
    2   5.3     m
    3   4.6     l
    4   9.8     m
    5   9.4     m
    6  14.1     m
    7  16.2     h
    8  16.4     h
    9  11.6     m
    10  8.0     m
    11  3.0     l
    12  5.0     m
    

    【讨论】:

      【解决方案2】:

      一个简单的基础 R 选项

      c("l","m","h")[(temp>=5) + (temp>=15)+1]
      

      给了

      [1] "l" "m" "l" "m" "m" "m" "h" "h" "m" "m" "l" "m"
      

      【讨论】:

        【解决方案3】:

        你不能疯狂地做你想做的事。因为一个因子向量,必须包含在级别中定义的值。换句话说,您不能插入未出现在向量中的级别、值或标签。下面我提出了另一种可以创建的方式,即为您的案例创建一个因子列。

        library(tidyverse)
        
        temp <- c(2.6, 5.3, 4.6,9.8,9.4,14.1,16.2,16.4,11.6,8.0,3.0,5.0)
        
        tab <- data.frame(
          temp = temp
        )
        
        tab <- tab %>% 
          mutate(
            case = case_when(
              temp < 5 ~ "Below 5",
              between(temp, 5, 15) ~ "Between 5 and 15",
              temp > 15 ~ "Above 15"
            )
          )
        
        tab$case <- factor(tab$case)
        

        【讨论】:

        • 你为什么说他们不能完全做到这一点?他们的向量还不是一个因素。他们正试图根据固定间隔创建一个。这就是基本的cut 函数的作用
        • 嘿卡米尔!我明白,他想将他的双精度向量转换为一个因子向量,其中字母“l”、“m”、“h”的水平,但保留向量中的双精度值。换句话说,一个双精度向量,具有包含字母“l”、“m”、“h”的级别属性。我可能只是糊涂了。但如果这是他想要的,R 不允许因子向量,其中向量中的值与级别属性中定义的值不同。