R 具有相同标签且相邻的群集组
我无法找到一个好的解决方案,但我认为甚至可能有一个base或tidyverse R函数可以做到这一点: 我的数据: 一行 标签 1. NA 2. 福 3. 福 4. 福 5. NA 6. NA 7. 福 8. 福 9 NA 10 福 11 NA ... ...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 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