【问题标题】:Using dplyr to mutate the following rows after meeting condition满足条件后使用 dplyr 对以下行进行变异
【发布时间】:2020-08-04 11:18:00
【问题描述】:

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

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

mtcars %>%
  mutate(type=ifelse(mpg>20,"Event", "No event")) %>%
  mutate(type=ifelse(type=="Event", lead(type),`type`))

我在这里要做的是生成一个名为 type 的新列,如果是 mpg>20,我希望该行声明“事件”,如果不是“无事件”。但是,我还希望mpg>20 后面的两行也显示“事件”,即使它们不符合条件。

希望这是有道理的

【问题讨论】:

  • 您希望mpg > 20 之后的下两行是“事件”还是前面的行?

标签: r dplyr


【解决方案1】:

我不确定我是否正确理解了这个问题。 不过你可以尝试修改if_else里面的逻辑表达式:

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

【讨论】:

  • 不是我想要的。如果 MPG > 20,我希望该行是“事件”,以下两行是“事件”。以下两行是否超过 MPG>20 无关紧要,对于所有其他行我想要“无事件”
  • 嗯。如果在 mtcars 第 4,5 和 6 行使用我的代码,则得到 "Event"。第四行中的mpg > 20 为真。在第 5 行和第 6 行中,我们有 mpg < 20。也许你发布你想要的输出
  • 抱歉,之前误读和误解了您的回复。完全正确。谢谢!
【解决方案2】:

对于一般的解决方案,您可以使用zoos 滚动功能。您可以根据想要回看的程度来调整窗口大小。

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 将其更改为"Event""No Event"

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

或者没有ifelse

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2020-05-12
    相关资源
    最近更新 更多