【问题标题】:How to fill the missing values for a replicated time series data?如何填充复制的时间序列数据的缺失值?
【发布时间】:2019-06-09 12:00:03
【问题描述】:

我正在尝试用一些缺失值填充复制的时间序列数据,并且我尝试了多种方法,但都没有奏效。

数据应该是这样的:

Year   Var
2001   1
2002   2
2003   3
2001   4
2002   5  
2001   6
2003   7

我想得到的是:

Year   Var
2001   1
2002   2
2003   3
2001   4
2002   5 
2003   NA 
2001   6
2002   NA
2003   7

我已经尝试merge(),首先构建了一个包含我需要的整个序列的数据框。

yearlabel <- data.frame(Year = rep(2001:2003, 3)    
df <- merge(df, yearlabel, all = T)

但结果有许多 length(df)*length(yearlabel) 行。

另外,我尝试了rowr 包中的cbind.fill,它只是在df 的末尾添加了NAs。如果我使用

Map(merge, df, yearlabel, by = 'Year', all = T),

它会返回:

Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column

谁能帮我解决这个问题?非常感谢!

【问题讨论】:

    标签: r merge missing-data


    【解决方案1】:

    这是complete 的一个选项。根据“年”的“最小”值创建列“grp”后,使用complete 将“年”从min 扩展到max,并使用seqarrange 基于行在“grp”上并删除“grp”列

    library(tidyverse)
    df1 %>%
       mutate(grp = cumsum(lag(Year  > lead(Year, default = 
                          last(Year)),default = TRUE))) %>%
       # or in this case, it can be simplified
       #mutate(grp = cumsum(Year == min(Year))) %>%
       complete(Year = min(Year):max(Year), grp) %>%
       arrange(grp) %>%
       select(-grp)
    # A tibble: 9 x 2
    #   Year   Var
    #  <int> <int>
    #1  2001     1
    #2  2002     2
    #3  2003     3
    #4  2001     4
    #5  2002     5
    #6  2003    NA
    #7  2001     6
    #8  2002    NA
    #9  2003     7
    

    数据

    df1 <- structure(list(Year = c(2001L, 2002L, 2003L, 2001L, 2002L, 2001L, 
     2003L), Var = 1:7), class = "data.frame", row.names = c(NA, -7L
      ))
    

    【讨论】:

    • 非常感谢,阿坤。但是当缺少最小年份时,我发现了一些问题。我已扩展数据的原始年份范围以解决问题。再次感谢您的帮助。
    • @YannZhang。如果没有模式,那就很难了。在这里,我假设数据是按升序排列的。每当顺序颠倒时,创建的“grp”将增加 1。
    猜你喜欢
    • 2015-12-03
    • 2013-01-13
    • 2019-05-16
    • 2016-12-08
    • 1970-01-01
    • 2021-03-07
    • 2015-02-17
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多