【问题标题】:Increment Row Number on Group each time it 'reappears' in R每次在 R 中“重新出现”时,增加组的行号
【发布时间】:2019-02-08 14:55:00
【问题描述】:

是否可以在 R 中创建一个列,每次另一列的组级别“重新出现”时以 1 的增量增加,即

视图(x)

vents    Group     Number of times present
    1           1               1
    2           1               1
    3           1               1
    4           2               1
    5           1               2
    6           1               2
    7           2               2
    8           2               2 
    9           3               1
    10          2               3
    11          3               2
    12          3               2
    13          2               4
    14          1               3
    15          1               3

(我想要的结果是“出现次数列”

假设上面的例子是我的数据框,我试过了:

x <- within(x, {Number of times present<- cumsum(c(1,abs(diff(Group))))})

但是,每次组级别更改时,这只会增加一(无论它是什么组以及它之前“重新出现”的次数的过去历史记录)

任何帮助将不胜感激(我的实际数据框非常大,但我猜测 for 循环可能是前进的方向?

谢谢

【问题讨论】:

  • 你能发布dput(x)的结果而不是图片吗?同时显示预期输出。
  • 你在找rleid
  • 不幸的是,聚类行的堆栈流问题虽然相似,但略有不同,因为“组”列不仅是 0 和 1,而且可以上升到 5。

标签: r


【解决方案1】:

我通过rle函数和1个for循环解决了这个问题:

x <- data.frame(Group = c(1, 1, 1, 2, 1, 1, 2, 2, 3, 2, 3, 3, 2, 1, 1))

rle(x$Group)
# Run Length Encoding
#  lengths: int [1:9] 3 1 2 2 1 1 2 1 2
#  values : num [1:9] 1 2 1 2 3 2 3 2 1

y1 <- rle(x$Group)$values
y2 <- rle(x$Group)$lengths
z <- c()
for(i in unique(y1)){
    z[y1 == i] <- 1 : sum(y1 == i)
}

rep(z, y2)
# [1] 1 1 1 1 2 2 2 2 1 3 2 2 4 3 3

【讨论】:

  • 谢谢。这正是我想要的!如果您不介意可以解释循环中的代码以及它是如何工作的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2021-09-29
  • 2018-10-08
  • 1970-01-01
  • 2023-03-18
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多