我有一个这样的数据框:
a <- c(1:9)
b <- as.factor(c("Day", "Day", NA, "Night", NA, "Day", NA, "Night", "Night"))
df<-data.frame(a=a,b=b)
我想根据已经存在的值有条件地替换NA值,以创建此值:
df$a <- c(1:9)
df$b <- as.factor("Day", "Day", "Dusk", "Night", "Dawn", "Day", "Dusk", "Night", "Night")
我已经使用na.locf()和fill()进行了探索,但还没有设法找到解决方案。
答案 0 :(得分:2)
require(dplyr)
df %>% mutate(b=as.factor(case_when(is.na(b) & lag(b)=="Day" ~ "Dusk",
is.na(b) & lag(b)=="Night" ~"Dawn",
TRUE ~ as.character(b))))
a b
1 1 Day
2 2 Day
3 3 Dusk
4 4 Night
5 5 Dawn
6 6 Day
7 7 Dusk
8 8 Night
9 9 Night
此方法使用dplyr
来突变b
,并将“ Day”之后的所有NA更改为“ Dusk”,将“ Night”之后的所有NA更改为“ Dawn”,并保留其他任何内容(如果有的话,包括所有领先的NA)。