【问题标题】:How to change numeric variable into categorical [duplicate]如何将数值变量更改为分类[重复]
【发布时间】:2019-09-07 13:09:00
【问题描述】:

我正在尝试将“Wine”变量更改为分类变量

wine_df
wine_df$Wine
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[112] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[149] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

创建 A=1、B=2、C=3 的类别

wine <- cut(wine_df$Wine, breaks=c(1,2,3), labels=c("A", "B", "C"))

Error in cut.default(wine_df$Wine, breaks = c(1, 2, 3), labels = c("A",  : 
  lengths of 'breaks' and 'labels' differ

但不断收到此错误:

Error in cut.default(wine_df$Wine, breaks = c(1, 2, 3), labels = c("A",  : 
  lengths of 'breaks' and 'labels' differ

有人可以就这个问题提供支持吗?

【问题讨论】:

    标签: r vector replace


    【解决方案1】:

    我们可以使用LETTERS 并相应地提取值

    输入

    x <- rep(1:3, 1:3)
    

    输出

    LETTERS[x]
    #[1] "A" "B" "B" "C" "C" "C"
    

    这里的重点是我们可以使用x按位置提取另一个向量的值。

    如果目标是改变 1 = x、2 = y 和 3 = z(或其他),我们可以做到

    c("x", "y", "z")[x]
    #[1] "x" "y" "y" "z" "z" "z"
    

    感谢 @zx8754 提供帮助的 cmets。

    【讨论】:

    • 可能 A、B、C 只是一个例子,可以是任何字符串。
    • 我确实尝试过,但对我来说没有成功:
    • @zx8754 好点。虽然我试图坚持 OP 给出的例子。如果这不是他们想要的,将删除/编辑。我想说明我们如何使用LETTERS
    • 不用删,可以指出,可以是任意字符串向量c("A", "B", "C")[ x ]
    【解决方案2】:

    在 R 中处理分类变量的一种方法是通过因素。来自帮助(?factor):

    函数factor用于将向量编码为因子(术语 “类别”和“枚举类型”也用于因子)。如果 参数ordered 为TRUE,假设因子水平是有序的。 为了与 S 兼容,还有一个函数ordered

    像这样,您可以将任意字符串指定为因子级别:

    levels <- factor(c("category a", "category b", "category c"))
    rep(1:3, 2)
    [1] 1 2 3 1 2 3
    levels[rep(1:3, 2)]
    [1] category a category b category c category a category b category c
    Levels: category a category b category c
    

    当然你也可以像这样分配“A”、“B”和“C”:

    levels <- factor(c("A", "B", "C"))
    rep(1:3, 2)
    [1] 1 2 3 1 2 3
    levels[rep(1:3, 2)]
    [1] A B C A B C
    Levels: A B C
    

    【讨论】:

      【解决方案3】:

      您可以正确使用cut 分配breaks。阅读?cut

      cut(x, 0:3, c("a", "b", "c"))
      
      #[1] a b b c c c
      #Levels: a b c
      

      使用@markus 的数据

      x <- rep(1:3, 1:3)
      

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多