在满足条件后使用dplyr对以下行进行变异
我试图通过dplyr中的ifelse语句添加一个新列,其中包含基于另一列的字符串。当条件满足时,我还希望下面两行也显示相同的值 我展示了mtcars数据集中的一个示例在满足条件后使用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`)) 这里我要做
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
之后的下两行是“事件”还是前两行?