以下两个问题之后:
removing the first 3 rows of a group with conditional statement in r
Assigning NAs to rows with conditional statement in r
我的代码遇到了一些麻烦。如果不是要删除行,而是要给其第一行中的值大于2的每个事件分配NA,因此,如果事件在其第一行中的值大于2,则希望将NA分配给该事件行,以及该事件的后两行。如果事件没有更多行,只需将NA分配给事件具有的行。
这里是一个示例,其中有一列我想要的欲望输出。
Event<- c(1,1,1,1,1,2,2,2,2,3,3,4,5,6,6,6,7,7,7,7)
Value<- c(1,0,8,0,8,8,7,1,10,4,0,1,10,3,0,0,NA,NA,5,0)
Desire_output<- c(1,0,8,0,8,NA, NA, NA,0,NA,NA,1,NA,NA,NA,NA,NA,NA,5,0)
AAA<- data.frame(Event, Value, Desire_output)
Event Value Desire_output
1 1 1 1
2 1 0 0
3 1 8 8
4 1 0 0
5 1 8 8
6 2 8 NA
7 2 7 NA
8 2 1 NA
9 2 10 10
10 3 4 NA
11 3 0 NA
12 4 1 1
13 5 10 NA
14 6 3 NA
15 6 0 NA
16 6 0 NA
17 7 NA NA
18 7 NA NA
19 7 5 5
20 7 0 0
注意:如果事件以NA开头,则不执行任何操作(如事件7)。
请让我知道您是否有想法,并在此先感谢您的宝贵时间。
dplyr
管道,可用于此操作:library(dplyr)
AAA %>%
group_by(Event) %>%
mutate(
bad = row_number() == 1 & !is.na(Value) & Value >= 2,
bad = bad | lag(bad, default = FALSE) | lag(bad, 2, default = FALSE),
bad = bad | is.na(Value),
Value2 = if_else(bad, NA_real_, Value)
) %>%
ungroup()
# # A tibble: 20 x 5
# Event Value Desire_output bad Value2
# <dbl> <dbl> <dbl> <lgl> <dbl>
# 1 1 1 1 FALSE 1
# 2 1 0 0 FALSE 0
# 3 1 8 8 FALSE 8
# 4 1 0 0 FALSE 0
# 5 1 8 8 FALSE 8
# 6 2 8 NA TRUE NA
# 7 2 7 NA TRUE NA
# 8 2 1 NA TRUE NA
# 9 2 10 10 FALSE 10
# 10 3 4 NA TRUE NA
# 11 3 0 NA TRUE NA
# 12 4 1 1 FALSE 1
# 13 5 10 NA TRUE NA
# 14 6 3 NA TRUE NA
# 15 6 0 NA TRUE NA
# 16 6 0 NA TRUE NA
# 17 7 NA NA TRUE NA
# 18 7 NA NA TRUE NA
# 19 7 5 5 FALSE 5
# 20 7 0 0 FALSE 0
我更新了数据
AAA$Desire_output[9] <- 10
因为它与您显示的框架不一致(并且显示更有意义)。