【问题标题】:Categorize continuous variable with dplyr [duplicate]用 dplyr 对连续变量进行分类[重复]
【发布时间】:2017-03-15 18:36:19
【问题描述】:

我想根据连续数据创建一个具有 3 个任意类别的新变量。

set.seed(123)
df <- data.frame(a = rnorm(100))

我会使用 base

df$category[df$a < 0.5] <- "low"
df$category[df$a > 0.5 & df$a < 0.6] <- "middle"
df$category[df$a > 0.6] <- "high"

有没有 dplyr,我猜是 mutate(),解决这个问题?

此外,有没有办法计算类别而不是选择它们? IE。让 R 计算类别的中断位置。

编辑

答案在这个thread,但是,它不涉及标签,这让我感到困惑(也可能让其他人感到困惑),因此我认为这个问题是有目的的。

【问题讨论】:

  • 尝试使用cut。见?cut
  • @GabrielFGeislerMesevage 当然,我读过那个,但是,它不涉及罗伯特和 aichao 下面提到的标签问题。对于像我这样的初学者,我认为这个线程是有目的的。如果我错了,请纠正我。
  • dplyr 通过case_when() 函数为此提供了一个简洁的解决方案。 dplyr.tidyverse.org/reference/case_when.html

标签: r dplyr


【解决方案1】:

要将数字转换为分类,请使用cut。在您的特定情况下,您希望:

df$category <- cut(df$a, 
                   breaks=c(-Inf, 0.5, 0.6, Inf), 
                   labels=c("low","middle","high"))

或者,使用dplyr

library(dplyr)
res <- df %>% mutate(category=cut(a, breaks=c(-Inf, 0.5, 0.6, Inf), labels=c("low","middle","high")))
##               a category
##1   -0.560475647      low
##2   -0.230177489      low
##3    1.558708314     high
##4    0.070508391      low
##5    0.129287735      low
## ...
##35   0.821581082     high
##36   0.688640254     high
##37   0.553917654   middle
##38  -0.061911711      low
##39  -0.305962664      low
##40  -0.380471001      low
## ...
##96  -0.600259587      low
##97   2.187332993     high
##98   1.532610626     high
##99  -0.235700359      low
##100 -1.026420900      low

【讨论】:

  • 另外,如果您希望对结果类别进行排序,请设置cut(..., ordered_result = TRUE)
【解决方案2】:

quantiles 用于cut

xs=quantile(df$a,c(0,1/3,2/3,1))
xs[1]=xs[1]-.00005
df1 <- df %>% mutate(category=cut(a, breaks=xs, labels=c("low","middle","high")))
boxplot(df1$a~df1$category,col=3:5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2017-09-19
    • 2019-12-28
    • 2023-02-21
    相关资源
    最近更新 更多