【问题标题】:Assign category based on magnitude of value根据价值大小分配类别
【发布时间】:2018-06-12 17:16:32
【问题描述】:

我有一个这样的data.table

dt1=data.table(id=c(001,001,002,002,003,003),
              score=c(4,6,3,7,2,8))

每个人在变量“score”上有 2 个分数。 我想根据他们的分数将每个人分配到可变结果中的一个类别。

如果他们的分数较低,他们会得到“A”,如果他们的分数较高,他们会得到“B”。所以决赛桌是这样的

dt2=data.table(id=c(001,001,002,002,003,003),
                score=c(4,6,3,7,2,8),
                category=c('A','B', 'A','B', 'A','B')) 

由于“分数”列中的值是随机的,因此应根据分配给每个人的数字的大小来分配类别。非常感谢任何帮助。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以orderi中的'score',按'id'分组,并将'category'分配为'A','B'

    library(data.table)
    dt1[order(score), category := c('A', 'B') , by = id]
    dt1
    #    id score category
    #1: 001     4        A
    #2: 001     6        B
    #3: 002     3        A
    #4: 002     7        B
    #5: 003     2        A
    #6: 003     8        B
    

    或者另一种选择是将逻辑向量转换为数字索引并根据该索引替换值

    dt1[, category := c('A', 'B')[(score != min(score)) + 1] ,by = id]
    

    数据

    dt1 <- data.table(id=c('001','001','002','002','003','003'), 
                       score=c(4,6,3,7,2,8))
    

    【讨论】:

      【解决方案2】:

      我们可以使用ifelse:

      library(data.table)
      dt1[, category := ifelse(score == min(score), 'A', 'B'), by = id]
      

      结果:

         id score category
      1:  1     4        A
      2:  1     6        B
      3:  2     3        A
      4:  2     7        B
      5:  3     2        A
      6:  3     8        B
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-19
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        • 2021-09-09
        • 2017-06-21
        相关资源
        最近更新 更多