當資料是連續的時,我想將我的資料分組到不同的塊中。試圖從這樣的虛擬資料中獲取組列:
a b group
<dbl> <dbl> <dbl>
1 1 1 1
2 2 2 1
3 3 3 1
4 4 NA NA
5 5 NA NA
6 6 NA NA
7 7 12 2
8 8 15 2
9 9 NA NA
10 10 25 3
我嘗試使用
test %>% mutate(test = complete.cases(.)) %>%
group_by(group = cumsum(test == TRUE)) %>%
select(group, everything())
但它沒有按預期作業:
group a b test
<int> <dbl> <dbl> <lgl>
1 1 1 1 TRUE
2 2 2 2 TRUE
3 3 3 3 TRUE
4 3 4 NA FALSE
5 3 5 NA FALSE
6 3 6 NA FALSE
7 4 7 12 TRUE
8 5 8 15 TRUE
9 5 9 NA FALSE
10 6 10 25 TRUE
有什么建議嗎?
uj5u.com熱心網友回復:
rle在基礎 R 中使用-
transform(df, group1 = with(rle(!is.na(b)), rep(cumsum(values), lengths))) |>
transform(group1 = replace(group1, is.na(b), NA))
# a b group group1
#1 1 1 1 1
#2 2 2 1 1
#3 3 3 1 1
#4 4 NA NA NA
#5 5 NA NA NA
#6 6 NA NA NA
#7 7 12 2 2
#8 8 15 2 2
#9 9 NA NA NA
#10 10 25 3 3
uj5u.com熱心網友回復:
如果您希望為此使用dplyr,可以考慮幾種方法。
首先,您可以查看從非完整案例(使用lag)到完整案例的轉換。
library(dplyr)
test %>%
mutate(test = complete.cases(.)) %>%
group_by(group = cumsum(test & !lag(test, default = F))) %>%
mutate(group = replace(group, !test, NA))
或者,您可以向 data.frame 添加行號。然后,您可以過濾以僅包括完整的案例,并根據行號中的差距進行group_by列舉cumsum。然后,連接回原始資料。
test$rn <- seq.int(nrow(test))
test %>%
filter(complete.cases(.)) %>%
group_by(group = c(0, cumsum(diff(rn) > 1)) 1) %>%
right_join(test) %>%
arrange(rn) %>%
dplyr::select(-rn)
輸出
a b group
<int> <int> <dbl>
1 1 1 1
2 2 2 1
3 3 3 1
4 4 NA NA
5 5 NA NA
6 6 NA NA
7 7 12 2
8 8 15 2
9 9 NA NA
10 10 25 3
uj5u.com熱心網友回復:
使用data.table,獲取rleid然后洗掉 NA 的組 ID,然后使用因子到整數轉換修復序列:
library(data.table)
setDT(test)[, group1 := {
x <- complete.cases(test)
grp <- rleid(x)
grp[ !x ] <- NA
as.integer(factor(grp))
}]
# a b group group1
# 1: 1 1 1 1
# 2: 2 2 1 1
# 3: 3 3 1 1
# 4: 4 NA NA NA
# 5: 5 NA NA NA
# 6: 6 NA NA NA
# 7: 7 12 2 2
# 8: 8 15 2 2
# 9: 9 NA NA NA
# 10: 10 25 3 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336880.html
標籤:r
上一篇:在R中計數大于20的觀察值
下一篇:按另一列重新排序因子
