【问题标题】:Sequentially count same groups in one column in R [duplicate]在R中的一列中按顺序计算相同的组[重复]
【发布时间】:2015-09-28 03:24:33
【问题描述】:

我有几列的数据框,我需要重新组合 col2 的序列,以便在标签从 a 更改为 b 或 b 到 a 后,它们使用新标签进行分组,您可以在 Desired 列中看到结果

testdf <- data.frame(mydate = seq(as.Date('2012-01-01'), 
                                  as.Date('2012-01-10'), by = 'day'),
                     col1 = 1:10,
                     col2 = c("a","a","b","b","a","b","a","b","a","a"),
                     Desired= c(1,1,2,2,3,4,5,6,7,7))

mydate col1 col2 所需 1 2012-01-01 1 一 1 2 2012-01-02 2 一 1 3 2012-01-03 3 b 2 4 2012-01-04 4 b 2 5 2012-01-05 5 一 3 6 2012-01-06 6 b 4 7 2012-01-07 7 一 5 8 2012-01-08 8 b 6 9 2012-01-09 9 一 7 10 2012-01-10 10 一 7 有什么方法可以在没有 FOR 循环的情况下解决这个问题。因为数据集有超过 100 万行。

【问题讨论】:

  • 我认为这是一个重复的问题,但这是一种方法:r &lt;- rle(as.character(testdf$col2)); r$values &lt;- seq_along(r$values); inverse.rle(r) data.table 包中的 rleid 还有一个不错的功能。
  • 一般建议:有这么多记录,您应该考虑使用数据表而不是数据帧(为了代码优雅和计算效率),see this
  • 正如@Frank 所说,library(data.table) ; rleid(testdf$col2) 应该这样做(使用开发版)

标签: r aggregate lapply labeling


【解决方案1】:

你可以试试这个:

output <- c(0,cumsum(diff(as.numeric(testdf$col2))!=0))+1
#> output
#[1] 1 1 2 2 3 4 5 6 7 7

【讨论】:

    【解决方案2】:

    这是一种更流行的方式。

    testdf %>% group_by(col2) %>% mutate(first = cumsum(as.numeric(col2))
    

    【讨论】:

    • 这可能是“流行”,但您确定这会产生所需的输出吗?如果我删除带有testdf &lt;- testdf[,-4] 的目标列并根据您的命令序列使用p &lt;- testdf %&gt;% group_by(col2) %&gt;% mutate(first = cumsum(as.numeric(col2))),那么这会在我的计算机上产生p 的结果,这与所需的输出不太相似。
    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多