【问题标题】:Categorizing Values in a data.frame对 data.frame 中的值进行分类
【发布时间】:2015-04-25 08:15:02
【问题描述】:

我有以下示例数据框:

> df <- data.frame(v=c("a", "a", "b", "b", "c", "d", "d"))
> df
  v 
1 a 
2 a 
3 b 
4 b 
5 c 
6 d 
7 d 

我想根据一些任意映射将这些值分类到单独的列中。例如:

  • a -> x
  • b -> x
  • c -> 是
  • d -> y

所以之后,我会得到以下内容:

  v cat
1 a   x
2 a   x
3 b   x
4 b   x
5 c   y
6 d   y
7 d   y

谢谢

【问题讨论】:

    标签: r data-cleaning


    【解决方案1】:

    这是一种选择:

    使用映射创建一个命名向量:

    x <- c(a = "x", b = "x", c = "y", d = "y")
    

    然后使用命名向量添加新列:

    df$cat <- x[df$v]
    df
    #  v cat
    #1 a   x
    #2 a   x
    #3 b   x
    #4 b   x
    #5 c   y
    #6 d   y
    #7 d   y
    

    【讨论】:

    • 谢谢,如果 v 中的值不是有效的标识符(例如“e f”)怎么办?
    • @oneself,然后相应调整命名向量,例如x &lt;- c(a = "x", b = "x", c = "y", "e f" = "y")
    • 谢谢,最后一个问题:如果缺少其中一个值会怎样?有没有办法指定默认值?
    • @oneself,您可以轻松地使用ifelsey &lt;- x[df$v]; df$cat &lt;- ifelse(is.na(y), "default", y)。另一种选择是使用我原始答案中的代码,然后替换所有 NA 条目(没有匹配项)。
    【解决方案2】:

    这是一个使用 data.frame 的选项,您可以在其中编写映射:

    library(plyr)
    
    mapping = data.frame(v=letters[1:4], cat=c("x","x","y","y"))
    
    join(df, mapping, by='v')
    #  v cat
    #1 a   x
    #2 a   x
    #3 b   x
    #4 b   x
    #5 c   y
    #6 d   y
    #7 d   y
    

    或者直接baseR:

    merge(df, mapping, by='v')
    #  v cat
    #1 a   x
    #2 a   x
    #3 b   x
    #4 b   x
    #5 c   y
    #6 d   y
    #7 d   y
    

    【讨论】:

    • 我在工作时倾向于使用 plyr,因此更多地使用 join 而不是 merge,只是 reflex ;)
    猜你喜欢
    • 2019-06-02
    • 2023-03-25
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    相关资源
    最近更新 更多