【问题标题】:Interpolate certain columns' NAs based on the condition of another column using R使用 R 根据另一列的条件插入某些列的 NA
【发布时间】:2021-12-28 04:25:30
【问题描述】:

给定一个样本数据如下:

df <- structure(list(date = structure(c(18912, 18913, 18914, 18915, 
18916, 18917, 18918, 18919, 18920, 18921, 18922, 18923), class = "Date"), 
    value1 = c(1.115668, NA, 
    1.093685, NA, 1.072135, 1.06152, 1.05101, NA, NA, 1.0201, 
    1.01, 1), value2 = c(1.015, 1.030225, NA, NA, 1.077284, 1.093443, 
    1.109845, 1.126493, NA, NA, NA, 1.195618
    )), row.names = c(NA, -12L), class = "data.frame")

假设我需要在value1value2 中插入NAs,但前提是datedate&gt;='2021-10-16' &amp; date&lt;='2021-10-20' 的日期范围内。

我使用了这段代码,但它适用于整个专栏value1

library(zoo)
df$value1 <- na.approx(df$value1)

如何根据上面的代码实现这一点?谢谢。

【问题讨论】:

  • 所以这个? na.approx(df$value1[df$date&gt;='2021-10-16' &amp; df$date&lt;='2021-10-20'])
  • 是的,所以我应该使用df$value1[df$date&gt;='2021-10-16' &amp; df$date&lt;='2021-10-20'] &lt;- na.approx(df$value1[df$date&gt;='2021-10-16' &amp; df$date&lt;='2021-10-20'])
  • 我编辑了这个问题,使其更适合多列情况的插值 NA。请检查。
  • 您可以只循环多列(如果 na.approx 没有矢量化。不记得了)。所以像sapply(df[-1], function(i)na.approx(i[df$date&gt;='2021-10-16' &amp; df$date&lt;='2021-10-20']))
  • 您介意添加您的代码作为此问题的答案吗? @Sotos

标签: r dplyr tidyverse zoo


【解决方案1】:

您可以过滤您的周期并遍历应用该函数的列,即

sapply(df[-1], function(i)zoo::na.approx(i[df$date>='2021-10-16' & df$date<='2021-10-20']))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多