在满足条件后使用dplyr对以下行进行变异

在满足条件后使用dplyr对以下行进行变异,r,dplyr,R,Dplyr,我试图通过dplyr中的ifelse语句添加一个新列,其中包含基于另一列的字符串。当条件满足时,我还希望下面两行也显示相同的值 我展示了mtcars数据集中的一个示例 mtcars %>% mutate(type=ifelse(mpg>20,"Event", "No event")) %>% mutate(type=ifelse(type=="Event", lead(type),`type`)) 这里我要做

我试图通过dplyr中的ifelse语句添加一个新列,其中包含基于另一列的字符串。当条件满足时,我还希望下面两行也显示相同的值

我展示了mtcars数据集中的一个示例

mtcars %>%
  mutate(type=ifelse(mpg>20,"Event", "No event")) %>%
  mutate(type=ifelse(type=="Event", lead(type),`type`))
这里我要做的是生成一个名为type的新列,如果
mpg>20
,我希望该行状态为“event”,如果不是“no event”。但是,我还希望
mpg>20
后面的两行也显示“Event”,即使它们不符合标准


希望这有意义

我不确定我是否正确理解了这个问题。 但是,您可以尝试修改
中的逻辑表达式(如果有):

mtcars %>%
  mutate(type = if_else(mpg > 20 | lag(mpg) > 20 | lag(mpg, n = 2) > 20, "Event", "No event"))

    mpg     type
1  21.0    Event
2  21.0    Event
3  22.8    Event
4  21.4    Event
5  18.7    Event
6  18.1    Event
7  14.3 No event
8  24.4    Event
9  22.8    Event
10 19.2    Event
11 17.8    Event
12 16.4 No event
13 17.3 No event
14 15.2 No event
15 10.4 No event
16 10.4 No event
17 14.7 No event
18 32.4    Event

对于一般解决方案,可以使用
zoo
s滚动功能。您可以根据希望回望的程度调整窗口大小

library(dplyr)
library(zoo)

mtcars %>% mutate(type = rollapplyr(mpg > 20, 3, any, partial = TRUE))


#    mpg cyl  disp  hp drat    wt  qsec vs am gear carb  type
#1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4  TRUE
#2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  TRUE
#3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1  TRUE
#4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1  TRUE
#5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2  TRUE
#6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1  TRUE
#7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 FALSE
#8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2  TRUE
#9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2  TRUE
#10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4  TRUE
#11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4  TRUE
#12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3 FALSE
#13 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3 FALSE
#...
#...
然后,您可以使用
ifelse
将其更改为
“事件”
“无事件”

mtcars %>%
  mutate(type = ifelse(rollapplyr(mpg > 20, 3, any, partial = TRUE), 
                      'Event', 'No event'))
mtcars %>%
  mutate(type = c('No event', 'Event')
                  [rollapplyr(mpg > 20, 3, any, partial = TRUE) + 1])
或不带
ifelse

mtcars %>%
  mutate(type = ifelse(rollapplyr(mpg > 20, 3, any, partial = TRUE), 
                      'Event', 'No event'))
mtcars %>%
  mutate(type = c('No event', 'Event')
                  [rollapplyr(mpg > 20, 3, any, partial = TRUE) + 1])

不完全是我想要的。如果MPG>20,我希望该行为“Event”,下面两行为“Event”。以下两行是否超过MPG>20并不重要,对于所有其他行,我希望“无事件”Hm。如果在
mtcars
第4、5和6行上使用我的代码,则获取
“事件”
。第四行中的
mpg>20
为真。在第5行和第6行中,我们有
mpg<20
。也许你发布了你想要的结果对不起,误读和误解了你之前的回答。完全正确。谢谢您希望
mpg>20
之后的下两行是“事件”还是前两行?