如何将具有离散值范围的数值向量转换为因子?
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 <- 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]"
【讨论】:
以上是关于如何将具有离散值范围的数值向量转换为因子?的主要内容,如果未能解决你的问题,请参考以下文章