我有数据,其简化版本如下:
df_current <- data.frame(
start = c('yes', rep('no', 5), 'yes', rep('no', 3)),
season = c('banana', rep('to update', 5), 'apple', rep('to update', 3)),
stringsAsFactors = F
)
让我们说“开始”变量指示新季节的开始时间,我可以将其与日期变量(不包括在内)结合使用来指示苹果和香蕉季节的开始位置。完成此操作后,我想更新“季节”列中的其余行。当前具有“要更新”值的所有行都应更新为具有其季节最近开始的水果类型的值(这些行按日期排列)。换句话说,我希望数据看起来像这样:
df_desired <- data.frame(
start = c('yes', rep('no', 5), 'yes', rep('no', 3)),
season = c(rep('banana', 6), rep('apple', 4)),
stringsAsFactors = F
)
我认为类似以下的方法会起作用:
updated <- df_current %>%
rowwise() %>%
mutate(season = case_when(
season != 'to update' ~ season,
season == 'to update' ~ lag(season)
))
但是,这会在所有“要更新”的值上生成NA。
答案 0 :(得分:2)
一种简单的方法是将replace
与"to update"
NA
然后使用fill
。
library(dplyr)
library(tidyr)
df_current %>%
mutate(season = replace(season, season == "to update", NA)) %>%
fill(season)
# start season
#1 yes banana
#2 no banana
#3 no banana
#4 no banana
#5 no banana
#6 no banana
#7 yes apple
#8 no apple
#9 no apple
#10 no apple
使用相同的逻辑,您还可以使用zoo::na.locf
用最新的非缺失值填充缺失值。
答案 1 :(得分:2)
之所以生成一堆NA
是因为season
在每个case_when
评估中仅包含一个值,因此lag(season)
总是产生{{1 }}。这是另一个使用NA
的基本R解决方案:
rle
答案 2 :(得分:1)
我们可以使用na_if
library(dplyr)
library(tidyr)
df_current %>%
mutate(season = na_if(season, "to update")) %>%
fill(season)
# start season
#1 yes banana
#2 no banana
#3 no banana
#4 no banana
#5 no banana
#6 no banana
#7 yes apple
#8 no apple
#9 no apple
#10 no apple