【问题标题】:R data.table group first,last and middle rows using rleidR data.table 使用 rleid 对第一行、最后一行和中间行进行分组
【发布时间】:2020-05-19 15:11:53
【问题描述】:

我需要使用 rleid 对数据表进行分组。应该是三组。第一行一组,最后一行一组,第一行和最后一行之间的所有其他行一组。

如果我有条件,我知道如何分组。喜欢

dt[,group := rleid(condition)]

【问题讨论】:

  • 数据和想要的输出?

标签: r data.table


【解决方案1】:

您可以有一个大小为nrow(dt) - 2 的常量向量来获得应用rleid() 的条件。

dt[, group := rleid(c(1, rep(2, nrow(dt) - 2), 3))]

【讨论】:

  • 第一组和最后一组有什么条件?
  • rleid() 不需要逻辑条件。我使用了“条件”c(1, 2, 2, 2, 2, ..., 2, 2, 2, 3)。所以我使该向量的第一个和最后一个条目与中间的条目不同(其中有nrow(dt) - 2。您也可以使用逻辑向量c(T, rep(F, .N - 2), T)。在这种情况下,.N 与@ 相同987654329@.
【解决方案2】:

您可以创建一个包含所有相同值的向量,然后将 replace 单个元素(例如第一个和最后一个元素)与其他元素。下面的代码创建一个列,第一行为1L,最后一行为3L,否则为2L

df[, group := replace(rep(2L, .N), c(1L, .N), c(1L, 3L))]

另一种使用rleid的方式是

df[, group:= rleid(.I %in% c(1L, .N))]

您还可以对数据表中尚未创建的变量进行分组操作。

df <- data.table(x = runif(100))

df[, .(sumx = sum(x)), 
   .(group = replace(rep(2L, nrow(df)), c(1L, nrow(df)), c(1L, 3L)))]

#    group       sumx
# 1:     1  0.1546382
# 2:     2 48.1939765
# 3:     3  0.4710213

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2016-06-13
    • 2015-10-10
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多