我想dplyr::lag()使用ifelse3 個條件和規則。如果因子Sthen NA,如果因子是Dthen monitor,但是如果D連續重復并且僅連續三次或更多次,則它們“戰斗”我嘗試這樣做:
test<-NULL
test$groups <-c("S","D","D","D","D","S","D","D","S")
test <- as.data.frame(test)
test%>%mutate(decision = ifelse(groups == "D", "Monitor",ifelse(groups == "D" & lag(groups, 2) == "D","Monitor", ifelse(groups == "D" & lag(groups, 3) == "D", "Combat",NA))))
groups decision
1 S <NA>
2 D Monitor
3 D Monitor
4 D Monitor
5 D Monitor
6 S <NA>
7 D Monitor
8 D Monitor
9 S <NA>
但是錯了,我的正確輸出是:
groups decision
1 S <NA>
2 D Monitor
3 D Monitor
4 D Combat
5 D Combat
6 S <NA>
7 D Monitor
8 D Monitor
9 S <NA>
請問,有什么幫助嗎?
uj5u.com熱心網友回復:
library(data.table)
setDT(test)[,id:=rleid(groups)][groups=="D",decision:=fifelse(1:.N>=3, "Combat","Monitor"), by=id][,.(groups,decision)]
輸出:
groups decision
<char> <char>
1: S <NA>
2: D Monitor
3: D Monitor
4: D Combat
5: D Combat
6: S <NA>
7: D Monitor
8: D Monitor
9: S <NA>
或者,您也可以這樣做(但我仍然結合使用data.table::rleid
test %>%
group_by(id:=data.table::rleid(groups)) %>%
mutate(decision = case_when(
groups=="D" & row_number()>=3 ~ "Combat",
groups=="D" & row_number()<3 ~"Monitor",
TRUE~as.character(NA))) %>%
ungroup() %>%
select(!id)
# A tibble: 9 x 2
groups decision
<chr> <chr>
1 S NA
2 D Monitor
3 D Monitor
4 D Combat
5 D Combat
6 S NA
7 D Monitor
8 D Monitor
9 S NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426661.html
上一篇:如何將R資料框轉換為指標值行
