根据上面满足条件的第一行变异值

时间:2019-07-12 05:53:41

标签: r dplyr

我有数据,其简化版本如下:

 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。

3 个答案:

答案 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