【问题标题】:Rows sequence by group using two columns使用两列按组排列行
【发布时间】:2020-11-11 16:26:59
【问题描述】:

假设我有以下 df

data <- data.frame(ID = c(1,1,1,1,1,1,1,2,2,2,2,3,3,3),
               Value = c(1,1,0,1,0,1,1,1,0,0,1,0,0,0),
               Result = c(1,1,2,3,4,5,5,1,2,2,3,1,1,1))

如何从前两列获取列Result

我尝试了使用 rle、seq、cumsum 和 cur_group_id 的不同方法,但无法轻松获取 Result

【问题讨论】:

  • 您能否通过获取结果列阐明您的意思。你想通过什么计算来达到Result 列?
  • @KentOrr 看看答案,我试图为 ID 和值的每个组合创建一个标识符。 ID和值的标识符必须相同,并且随着'Value'列的值变化而增加

标签: r dplyr seq cumsum rle


【解决方案1】:
library(data.table)
library(dplyr)

data %>% 
  group_by(ID) %>% 
  mutate(Result2 = rleid(Value))

这给了我们:

     ID Value Result Result2
   <dbl> <dbl>  <dbl>   <int>
 1     1     1      1       1
 2     1     1      1       1
 3     1     0      2       2
 4     1     1      3       3
 5     1     0      4       4
 6     1     1      5       5
 7     1     1      5       5
 8     2     1      1       1
 9     2     0      2       2
10     2     0      2       2
11     2     1      3       3
12     3     0      1       1
13     3     0      1       1
14     3     0      1       1

【讨论】:

  • 那是快速、优雅和直接的。谢谢
  • 没问题,乐于助人。
【解决方案2】:

这行得通吗:

library(dplyr)
data %>% group_by(ID) %>% mutate(r = rep(seq_along(rle(ID*Value)$values), rle(ID*Value)$lengths))
# A tibble: 14 x 4
# Groups:   ID [3]
      ID Value Result     r
   <dbl> <dbl>  <dbl> <int>
 1     1     1      1     1
 2     1     1      1     1
 3     1     0      2     2
 4     1     1      3     3
 5     1     0      4     4
 6     1     1      5     5
 7     1     1      5     5
 8     2     1      1     1
 9     2     0      2     2
10     2     0      2     2
11     2     1      3     3
12     3     0      1     1
13     3     0      1     1
14     3     0      1     1

【讨论】:

  • 感谢您的仅基于 dplyr 的回复。我试图用 seq_along 和 rle 做类似的事情,但失败了
【解决方案3】:

我们可以在base R 中使用rleave

data$Result2 <- with(data, ave(Value, ID, FUN = 
   function(x) inverse.rle(within.list(rle(x), values <- seq_along(values)))))
data$Result2
#[1] 1 1 2 3 4 5 5 1 2 2 3 1 1 1

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多