【问题标题】:R data.table: How to "label" consecutive values in a column?R data.table:如何在列中“标记”连续值?
【发布时间】:2017-04-24 20:05:02
【问题描述】:

我有以下data.table(不过如果你用它作为data.frame也可以)

library(data.table)

dt <- data.table(first_column = c("item1", "item2", "item3", "item4", "item5", "item6", "item7"),
second_column = c("cat1", "cat1", "cat1", "cat2", "cat2", "cat2", "cat2"), third_column = c(50, 10, 18, 3092, 731, 189, 1991))

> dt
   first_column second_column third_column
1:        item1          cat1           50
2:        item2          cat1           10
3:        item3          cat1           18
4:        item4          cat2         3092
5:        item5          cat2          731
6:        item6          cat2          189
7:        item7          cat2         1991

我想:

(1) 如果值为

(2) 然后为这些唯一的 1 分组编号

生成的 data.table 如下所示:

> dt

  first_column second_column  third_column  labels
0        item1          cat1            50     1
1        item2          cat1            10     1
2        item3          cat1            18     1
3        item4          cat2          3092     0
4        item5          cat2           731     2
5        item6          cat2           189     2
6        item7          cat2          1991     0

这将创建一个全零和一的列:

dt$new[which(dt$third_column < 1000)] = 1

然后我将如何标记这些 1 的“分组”?

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:

    我们按'second_column'分组,在'i'中指定逻辑条件(third_column &lt;= 1000),将'labels'分配(:=)为.GRP,然后下一步将NA值替换为0

    dt[third_column<=1000, labels := .GRP , second_column][is.na(labels), labels :=0][]
    #     first_column second_column third_column labels
    #1:        item1          cat1           50      1
    #2:        item2          cat1           10      1
    #3:        item3          cat1           18      1
    #4:        item4          cat2         3092      0
    #5:        item5          cat2          731      2
    #6:        item6          cat2          189      2
    #7:        item7          cat2         1991      0
    

    或者通过获取逻辑向量 (!duplicated(second_column)) 的累积和并将其与另一个逻辑向量 (third_column &lt;= 1000) 相乘,第二个选项更紧凑

    dt[, labels := cumsum(!duplicated(second_column))*(third_column <= 1000)]
    dt
    #    first_column second_column third_column labels
    #1:        item1          cat1           50      1
    #2:        item2          cat1           10      1
    #3:        item3          cat1           18      1
    #4:        item4          cat2         3092      0
    #5:        item5          cat2          731      2
    #6:        item6          cat2          189      2
    #7:        item7          cat2         1991      0
    

    【讨论】:

    • 谢谢!你能解释一下.GRP吗?如何使用这个? (当然,这样我可以了解更多。)
    • @ShaZhengYang,假设你按second_column分组,然后.GRP返回分组索引为1、2、3等的序列,你可以通过dt[, .GRP, second_column]查看它会是一个汇总输出,但是当我们分配 (:=) 时,它将复制到每个 gruping 元素的行数
    • 谢谢!优秀
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2019-12-18
    • 2020-08-23
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多