【问题标题】:Adding missing rows添加缺失的行
【发布时间】:2013-05-20 12:18:25
【问题描述】:

我的excel数据文件的格式是:

 day                 value
 01-01-2000 00:00:00    4
 01-01-2000 00:01:00    3
 01-01-2000 00:02:00    1
 01-01-2000 00:04:00    1

我用这个打开我的文件:

ts = read.csv(file=pathfile, header=TRUE, sep=",")

如何将“值”列中编号为零的其他行添加到数据框中。输出示例:

 day                  value
 01-01-2000 00:00:00    4
 01-01-2000 00:01:00    3
 01-01-2000 00:02:00    1
 01-01-2000 00:03:00    0
 01-01-2000 00:04:00    1

【问题讨论】:

    标签: r posixct


    【解决方案1】:

    Tidyr 提供了很好的complete 函数来为隐式丢失的数据生成行。我在第二步中使用 replace_na 将 NA 值变为 0。

    ts%>%
      tidyr::complete(day=seq.POSIXt(min(day), max(day), by="min"))%>%
      dplyr::mutate(value=tidyr::replace_na(value,0))
    

    请注意,我将日期的粒度设置为分钟,因为您的数据集每分钟需要一行。

    【讨论】:

      【解决方案2】:

      这现在在padr 包中完全自动化。只需要一行代码。

      original <- data.frame(
        day = as.POSIXct(c("01-01-2000 00:00:00",
                           "01-01-2000 00:01:00",
                           "01-01-2000 00:02:00",
                           "01-01-2000 00:04:00"), format="%m-%d-%Y %H:%M:%S"),
        value = c(4, 3, 1, 1))
      
      library(padr)
      library(dplyr) # for the pipe operator
      original %>% pad %>% fill_by_value(value)
      

      请参阅 vignette("padr")this 博客文章了解其工作原理。

      【讨论】:

      • 只有当数据中有DatePOSIXctPOSIXlt类的变量时才有效。如果时间维度是int,也可以吗?
      • padr::pad_int这个函数。
      【解决方案3】:

      我认为这是一个更通用的解决方案,它依赖于创建所有时间戳的序列,将其用作新数据帧的基础,然后在适用的 df 中填写原始值。

      # convert original `day` to POSIX
      ts$day <- as.POSIXct(ts$day, format="%m-%d-%Y %H:%M:%S", tz="GMT")
      
      # generate a sequence of all minutes in a day
      minAsNumeric <- 946684860 + seq(0,60*60*24,by=60) # all minutes of your first day
      minAsPOSIX <- as.POSIXct(minAsNumeric, origin="1970-01-01", tz="GMT") # convert those minutes to POSIX
      
      # build complete dataframe
      newdata <- as.data.frame(minAsPOSIX)
      newdata$value <- ts$value[pmatch(newdata$minAsPOSIX, ts$day)] # fill in original `value`s where present
      newdata$value[is.na(newdata$value)] <- 0 # replace NAs with 0
      

      【讨论】:

        【解决方案4】:

        试试:

        ts = read.csv(file=pathfile, header=TRUE, sep=",", stringsAsFactors=F)
        ts.tmp = rbind(ts,list("01-01-2000 00:03:00",0))
        ts.out = ts.tmp[order(ts.tmp$day),]
        

        请注意,您需要将第一列中的字符串强制加载为字符,而不是因素,否则您将遇到 rbind 问题。要使日期列成为一个因素,而不仅仅是这样做:

        ts.out$day = as.factor(ts.out$day)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-19
          • 2015-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多