R 具有相同标签且相邻的群集组

R 具有相同标签且相邻的群集组,r,R,我无法找到一个好的解决方案,但我认为甚至可能有一个base或tidyverse R函数可以做到这一点: 我的数据: 一行 标签 1. NA 2. 福 3. 福 4. 福 5. NA 6. NA 7. 福 8. 福 9 NA 10 福 11 NA ... ... 在base R中,可以使用rle df1$FooCluster <- inverse.rle(within.list(rle(is.na(df1$Label)), { values[values] <- NA

我无法找到一个好的解决方案,但我认为甚至可能有一个base或tidyverse R函数可以做到这一点:

我的数据:

一行 标签 1. NA 2. 福 3. 福 4. 福 5. NA 6. NA 7. 福 8. 福 9 NA 10 福 11 NA ... ...
base R
中,可以使用
rle

df1$FooCluster <- inverse.rle(within.list(rle(is.na(df1$Label)), {
         values[values] <- NA
         values[!is.na(values)] <- seq_along(values[!is.na(values)])}))
数据
df1这里是另一个使用嵌套的
cumsum
的选项(但是,其背后的逻辑并不像

   Row Label FooCluster
1    1  <NA>         NA
2    2   Foo          1
3    3   Foo          1
4    4   Foo          1
5    5  <NA>         NA
6    6  <NA>         NA
7    7   Foo          2
8    8   Foo          2
9    9  <NA>         NA
10  10   Foo          3
11  11  <NA>         NA
行标签群集
11NA
2 2 Foo 1
3富1
4 Foo 1
5 NA
6 NA
7富2
8富2
9 NA
10 10 Foo 3
11不适用

非常感谢@akrun。它总是令人兴奋,人们是如何想出这样神奇的台词的呢
library(data.table)
setDT(df1)[, grp := rleid(!is.na(Label))][!is.na(Label), 
      FooCluster := .GRP , grp][, grp := NULL][]
df1 <- structure(list(Row = 1:11, Label = c(NA, "Foo", "Foo", "Foo", 
NA, NA, "Foo", "Foo", NA, "Foo", NA)), class = "data.frame", row.names = c(NA, 
-11L))
transform(
  df,
  FooCluster = replace(
    rep(NA, length(Label)),
    !is.na(Label),
    cumsum(diff(c(0, cumsum(is.na(Label))[!is.na(Label)])) > 0)
  )
)
   Row Label FooCluster
1    1  <NA>         NA
2    2   Foo          1
3    3   Foo          1
4    4   Foo          1
5    5  <NA>         NA
6    6  <NA>         NA
7    7   Foo          2
8    8   Foo          2
9    9  <NA>         NA
10  10   Foo          3
11  11  <NA>         NA