有条件地在组内的上一行中设置值

时间:2017-09-09 18:26:59

标签: r

我有一个数据框" df"像这样,用#34; nest分组。"

  nest  laid  stage
    1    NA     2
    1     5     4
    1   -10     NA
    2    NA     1
    2     3     1
    2    -8     NA

我想创造一个条件,以便如果"奠定"是> 0,"阶段"在上次访问时该巢的设置为0.如果"奠定了"不大于0,我想在#34; stage"。

中没有变化

期望的结果:

  nest  laid  stage
    1    NA     0
    1     5     4
    1   -10     NA
    2    NA     0
    2     3     1
    2    -8     NA

我在下面尝试了不同版本的代码(dplyr和tidyr),但有各种错误:

df1 <- df %>%
  group_by(nest) %>%
  mutate(stage, if(laid > 0){stage = 0}) %>%
  fill(stage, .direction = "up")

我已经过了类似的问题,但他们都使用了ifelse。非常感谢任何提示!

1 个答案:

答案 0 :(得分:4)

如果您不确定列数据类型,可以使用if_else(或ifelse),这是if/else的矢量化版本;要检查下一个laid值,请使用lead

df %>% 
    group_by(nest) %>% 
    mutate(stage = if_else(lead(laid) > 0, 0L, stage))

# A tibble: 6 x 3
# Groups:   nest [2]
#   nest  laid stage
#  <int> <int> <int>
#1     1    NA     0
#2     1     5     4
#3     1   -10    NA
#4     2    NA     0
#5     2     3     1
#6     2    -8    NA