【问题标题】:Trying to lag only some variables with dplyr [duplicate]尝试使用 dplyr 仅滞后一些变量 [重复]
【发布时间】:2020-12-09 12:23:21
【问题描述】:

我正在尝试保留原始数据,但仅计算某些文本行的延迟。我试过过滤,但它遗漏了数据。此外,滞后似乎并没有真正考虑到 dt..

你怎么看?

library (tidyverse)
df2<- nycflights13::weather
df2 <- df2 %>% mutate (dt= as.Date(time_hour)) %>% add_count(origin,dt)
df2 <- df2 %>% mutate(lag_ewr1=lag(n,1))

【问题讨论】:

  • lag 有一个名为“order_by”的附加参数,您可以使用它来确保它按正确的变量排序。从您的问题中我不清楚您想要滞后哪些行以及您不想滞后哪些行。
  • 您想为每个日期创建一个滞后列吗? df2 %&gt;% group_by(dt) %&gt;% mutate(lag_ewr1=lag(n,1))?
  • 谢谢。我想按 dt 分组,但只得到 EWR 机场的滞后,其他机场应该是空白的。像这样但保留所有行df2 &lt;- df2 %&gt;% group_by(dt) %&gt;% filter(origin=="EWR") %&gt;% mutate(lag_ewr1=lag(n,1))
  • @RonakShah 请注意,在您的解决方案中,滞后不准确,它仅指每个 dt 中的第一行,例如 2013 年 1 月 1 日除第 17 行之外的所有行,什么时候应该是 NA
  • 您的原始帖子中未提及“EWR”机场条件,因此我们无法知道您只想lag 那个机场。然而,这应该在我下面的回答中处理。

标签: r


【解决方案1】:

您可以为每个dt 设置lag 并将lag_ewr1 更改为NA 用于除"EWR" 之外的所有其他机场。

library(dplyr)

df2 %>% 
  group_by(dt) %>% 
  mutate(lag_ewr1=lag(n,1)) %>%
  ungroup %>%
  mutate(lag_ewr1 = replace(lag_ewr1, origin != 'EWR', NA)) 

如果我们想在日期值之间滞后,我们可以使用:

df2 %>% 
  arrange(dt, origin) %>%
  group_by(dt) %>% 
  summarise(lag_ewr1 = first(n)) %>%
  mutate(lag_ewr1 = lag(lag_ewr1)) %>%
  left_join(df2, by = 'dt') %>%
  mutate(lag_ewr1 = replace(lag_ewr1, origin != 'EWR', NA))

【讨论】:

  • 一如既往的感谢!
  • 关于此解决方案的快速问题。我们可以看到 2013 年 1 月 1 日的 lag_ewr1 对于所有这些行都应该是 NA,对于 2013 年 1 月 2 日的所有行来说应该是 17。快速浏览一下就知道它不是那样的......df3 &lt;- df2 %&gt;% filter(origin=="EWR") df3 &lt;- df3 %&gt;% dplyr::select(dt,lag_ewr1) df3 %&gt;% filter(dt == "2013-01-01" | dt == "2013-01-02")
  • 原来的解决方案不是这样。 lag 发生在同一个 dt 中。我认为更新后的答案正是您真正想要的。
  • 只是一个小问题,这个解决方案如何用于 lag2、lag3 等。我们可以用什么来代替第一个函数?
  • 在这种情况下,您选择哪个值并不重要,因为所有值都相同。我选择了first,你可以选择2nd,3rd。如果您想要lag2,您需要将lag 行更改为mutate(lag_ewr1 = lag(lag_ewr1, 2))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多