【发布时间】:2020-05-19 15:11:53
【问题描述】:
我需要使用 rleid 对数据表进行分组。应该是三组。第一行一组,最后一行一组,第一行和最后一行之间的所有其他行一组。
如果我有条件,我知道如何分组。喜欢
dt[,group := rleid(condition)]
【问题讨论】:
-
数据和想要的输出?
标签: r data.table
我需要使用 rleid 对数据表进行分组。应该是三组。第一行一组,最后一行一组,第一行和最后一行之间的所有其他行一组。
如果我有条件,我知道如何分组。喜欢
dt[,group := rleid(condition)]
【问题讨论】:
标签: r data.table
您可以有一个大小为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@.
您可以创建一个包含所有相同值的向量,然后将 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
【讨论】: