【问题标题】:Select subset of dataframe based collected in the last N unique dates选择基于最近 N 个唯一日期收集的数据框子集
【发布时间】:2021-12-13 14:17:53
【问题描述】:

我正在寻找一种过滤数据框的方法,以便保留数据集中最后 N 个唯一日期的所有数据,不包括 NA。我的数据不是以任何已知的频率收集的——有些日子可能包含 100 个数据点,然后几周都没有数据。最终目标是根据可用的最新数据对时间进行回归分析。如果我只是做一个尾部函数并选择最后 N 行(按日期排列),我有时会得到 1-2 天的所有数据,这不适合一个好的回归时间。

关于如何完成此任务的任何建议?

数据看起来像附加的。我唯一尝试的是如下所示的 tail(df, 30) 函数,然后进行线性回归,这时我意识到结果看起来很奇怪,因为我显然在 12/11 有超过 30 个数据点。

all_data2 <- all_data2 %>%
        filter(!!sym(test_par[j]) < upper_q, !!sym(test_par[j]) > lower_q ) %>%
        mutate(week=difftime(code_date, as.Date(x_start), units = c("weeks")))

      all_data2 <- all_data2 %>%
        mutate(test_par_avg=SMA(all_data2[test_par[j]], n=nsmooth)) %>%
        filter(!is.na(test_par_avg)) %>%
        arrange(code_date) %>%
        tail(no_tail)
      
       model <- lm(test_par_avg ~ week, data=all_data2)

【问题讨论】:

  • 如果您能与我们分享一些测试数据,并且向我们展示您已经尝试过的内容,那就太好了。
  • 请以复制/粘贴文本的形式分享示例数据,以便我们可以测试代码并演示解决方案,而不是图片。 dput(your_data[1:10, ]) 将为我们提供前 10 行数据的复制/粘贴版本,包括所有类和结构信息。请选择一个合适的小子集来说明问题。

标签: r


【解决方案1】:

这就是你要找的吗?

my_df <- data.frame("Date" = c("01/01/2021", "01/01/2021", "02/02/2021", "03/03/2021", "03/05/2021", NA, "03/03/2021"),
                "Value" = c(2, NA, NA, 2, 4, 4, 1),
                stringsAsFactors = FALSE)

my_df <- my_df[complete.cases(my_df),]
my_df <- my_df %>% group_by(dmy(Date)) %>% mutate(ID = cur_group_id())

my_number <- 2
my_value <- sort(unique(my_df$ID))
my_value <- tail(my_value, my_number)
my_var <- which(my_df$ID %in% my_value)
if (length(my_var)) {
  my_df <- my_df[my_var,]
}

所以首先 complete.cases 允许我们保留所有没有任何 NA 值的行。

然后我们为所有唯一的 Date 值分配一个唯一的 ID。

最后一部分用于选择 N 个独特的日子,所以这里 N = 2。

【讨论】:

  • 太好了,谢谢。我想这就是我正在寻找的 - 无论哪种方式,我都会尝试让您知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2017-05-15
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多