如何在长格式时间序列数据中按时间点拆分输出?

Posted

技术标签:

【中文标题】如何在长格式时间序列数据中按时间点拆分输出?【英文标题】:How to split output by timepoint in long format time-series data? 【发布时间】:2021-11-06 08:15:52 【问题描述】:

我想使用 naniar 包中的 gg_miss_var() 来查看我的数据框中每个时间点的缺失数据量。数据框包含长格式的时间序列数据。

我的代码可以与 df 整体配合使用(请参阅下面 代码 中的 #1)。如何扩展它以生成按 Timepoint 拆分的输出(请参阅下面 代码 中的 #2 了解我尝试的代码)?

为了澄清,我想做的基本上是使用每个时间点的数据(每个 Timepoint 变量)在 代码 中重复 #1。因此,每个变量的缺失数据量将分别针对基线数据、第 1 年数据和第 2 年数据呈现。目前,代码中的 #1 查看所有时间点(即基线、第 1 年、第 2 年)的缺失数据。

我将使用此数据 df 按 Timepoint 进行进一步分析,例如回归,因此理想情况下,我会喜欢易于为这些目的操作的代码。

下面是一个示例数据框(请参阅示例数据)。请注意,我正在使用的数据框要大得多(即 N = ~21,900)

代码

library(tidyverse)
library(naniar) # for gg_miss_var()

# 1. All missing data
gg_miss_var(df[,c("Score.1","Score.2","Score.3","Score.4")]) 

# 2. Missing data split by timepoint [does not work]
df %>% 
  group_by(Timepoint) %>% 
  gg_miss_var(.[,c("Score.1","Score.2","Score.3","Score.4")]) %>%
  ungroup()

示例数据


df <- structure(list(ID = c(1L, 1L, 1L, 2L, 
2L, 3L),  Timepoint = c("baseline", "year1", "year2", 
"baseline", "year1", "baseline"), Score.1 = c(NA, 6, 4, 4, 5, 5), Score.2 = c(11, 
10, 8, 8, 8, 9), Score.3 = c(4, NA, 9, 10, 8, 6), Score.4 = c(22, 
50, 33, 28, 27, 33)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

示例输出

以下是代码中#1的输出。我想要的是下面的副本,仅使用来自相应时间点的数据(即基线、第 1 年、第 2 年)。

【问题讨论】:

你能解释一下你所说的“分裂”是什么意思吗?如果每个 Timepoint 类 baseline, year1, yeare2 的数量相同,您可以在该列上 pivot_wider 并为每个类获取一个单独的列。如果要分别分析每个 Timepoint 类,可以使用filter 制作单独的数据集。你能举一个你最终想要做什么的例子吗? 请添加使用的包,因为据我所知gg_miss_var 不是基本 R 函数。 您的预期输出如何? 【参考方案1】:

你期待吗?

library(tidyverse)
library(naniar)
df %>% select(-ID) %>% 
  group_by(Timepoint) %>% 
  gg_miss_var(facet = Timepoint)

除非您更喜欢三个独立的地块。然后这样做:

df %>% select(-ID) %>% 
  group_by(Timepoint) %>% 
  group_map(~gg_miss_var(.x)+ggtitle(.y))

这是你期待的效果吗?

【讨论】:

以上是关于如何在长格式时间序列数据中按时间点拆分输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在PHP中按字符将数组拆分为关联数组[重复]

使用 itertools 将列表拆分为递增的序列

如何从python中的字典输出中组装时间序列数据以进行监督分类

在 GCP 中按行拆分大文件

在 Python 中按共同日期加入时间序列(数据框和系列/列表问题)

序列排序