如何将具有离散值范围的数值向量转换为因子?

Posted

技术标签:

【中文标题】如何将具有离散值范围的数值向量转换为因子?【英文标题】:How can I convert a numeric vector with discreete value ranges into a factor? 【发布时间】:2021-03-03 08:18:29 【问题描述】:

我正在尝试将具有离散值的数值向量转换为 R 中的一个因子。

x <- c(1,2,3,4,8,9,10,88,89,90)

我需要把这个向量转换成一个4级的因子变量如下:

1,2(1级)

3,4(2级)

8,9,10(3级)

88,89, 90(4级)

我尝试在 R 中使用因子如下:

y <- factor(x, levels = c(1:2, 3:4, 8:10, 88:90))

这将返回一个具有 10 个级别的因子,而不是我想要的具有 4 个级别的因子。

str(y)
Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10

我也尝试过如下使用 cut:

bins <-  c(1,3,5,8,11,88,90)
y <- cut(x, breaks = bins, right = F, include.lowest = T)
table(y)

这也不会返回所需的结果,因为它会为我不需要的 [5-8) 和 [11-88) 等范围创建一个级别。

y
  [1,3)   [3,5)   [5,8)  [8,11) [11,88) [88,90] 
      2       2       0       3       0       3 

有没有办法将一系列数值转换为 R 中的一个因子?

【问题讨论】:

删除未使用的关卡:table(droplevels(y)) factor(findInterval(x, c(3,8,88)))? 或者level &lt;- cut(x, breaks = c(-Inf, 2, 4, 10, Inf), labels = paste("level", 1:4), right = TRUE); aggregate(x~level, FUN = toString)? (您可能不需要aggregate 步骤但不确定) 【参考方案1】:

我们可以使用case_when

library(dplyr)
case_when(x %in% 1:2 ~ 1, x %in% 3:4 ~ 2, x %in% 8:10 ~ 3, x%in% 88:90 ~ 4)

【讨论】:

【参考方案2】:

删除未使用的关卡:

# as per your code    
bins <-  c(1,3,5,8,11,88,90)
y <- cut(x, breaks = bins, right = FALSE, include.lowest = TRUE)
levels(y)
# [1] "[1,3)"   "[3,5)"   "[5,8)"   "[8,11)"  "[11,88)" "[88,90]"

# drop unused levels
y1 <- droplevels(y)
levels(y1)
#[1] "[1,3)"   "[3,5)"   "[8,11)"  "[88,90]"

【讨论】:

以上是关于如何将具有离散值范围的数值向量转换为因子?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串数字的单元格数组转换为数值向量[重复]

如何连接因子,而不将它们转换为整数级别?

将因子变量分钟:秒转换为R中的数值变量分钟.秒

如何在Typescript中把字母数字值转换为数值范围?

因子到数值的转换

如何获取具有值范围的列表并转换为数据框