【问题标题】:Taking the average of lead and lag dates in dplyr mutate在 dplyr mutate 中取领先和滞后日期的平均值
【发布时间】:2020-08-11 00:43:03
【问题描述】:

我试图找出上面一行和下面一行的日期的平均值。但是, lag(Date) 和 lead(Date) 正在生成向量,mean() 然后拒绝使用返回的 NA 来代替(弄清楚这让我费了太长时间)。

df <- data_frame(Date = as.Date(c("2020-01-01", NA, "2020-12-12")))
df <- mutate(df, Date = replace_na(Date, mean(c(lag(Date),lead(Date)))))

这给出了 ("2020-01-01", NA, "2020-12-12") 而我想要的是 ("2020-01-01, "2020-06-06", "2020-12- 12")

那么如何访问 Date 的上一行和下一行值,以便生成平均值?

【问题讨论】:

  • 我建议你使用滑动功能,查看 tsibble 包
  • 试试mean(......na.rm=TRUE)
  • 所以 na.rm=TRUE 有效(对于我的最小示例,但不是我真正的问题),但我不明白为什么。大概滞后和领先仍然会产生向量,或者我只是完全误解了正在发生的事情。

标签: r dataframe tidyverse dplyr


【解决方案1】:

data_frame 已弃用,因此我们已将其替换为 data.frametibble 将是一个替代方案,但涉及额外的依赖项。在 zoo 中使用 na.approx 并将其转换回 Date 类,因为它会产生数字输出。这也适用于连续插入多个 NA。如果我们使用leadlag,这将不起作用。如果末端有 NA,这会使它们保持原样,或者我们也可以使用 na.approx 的不同参数来填充它们;但是,在示例数据中没有这样的 NA,因此我们将其保留为所示。

(注意,正确的中点如下图所示,而不是问题中所示。2020-01-01 和 2020-06-22 之间以及 2020-06-22 和 2020-12 之间有 173 天-12.)

library(dplyr)
library(zoo)

df <- data.frame(Date = as.Date(c("2020-01-01", NA, "2020-12-12"))) # test input

mutate(df, Date = as.Date(na.approx(Date, na.rm = FALSE)))

给予:

        Date
1 2020-01-01
2 2020-06-22
3 2020-12-12

【讨论】:

  • 我不知道为什么,但是虽然其他答案适用于我的最小示例,但它们不适用于我的真正问题。然而,这个使用动物园的人确实做到了,因为我无法理解。
【解决方案2】:

Base R one liner 解决您的示例数据(怀疑您有多个 NA 实例 - 请参阅下面的解决方案):

df$Date <- ifelse(is.na(df$Date), mean(df$Date, na.rm = TRUE), df$Date)

插入日期:

df$Date <- as.Date(ifelse(
  is.na(df$Date),
  approx(as.numeric(df$Date), method = "linear", n = nrow(df))$y[which(is.na(df$Date))]
  ,
  df$Date
),
origin = as.Date("1970-01-01", "%Y-%m-%d"),
"%d-%m-%Y")

使用的数据:

df <- data.frame(Date = as.Date(c("2020-01-01", NA, "2020-12-12")))

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多