【问题标题】:Are all dates in order所有日期都井井有条吗
【发布时间】:2016-03-07 02:36:52
【问题描述】:

我正在尝试将 diff() 应用于一系列包含日期的列。我对 date1-date2、date2-date3 等之间的区别感兴趣。

我有兴趣:

  1. 日期之间的实际差异(天)
  2. 如果一行的所有日期都按顺序排列(diff >= 0,按行)

我可以在一系列日期上使用 diff() (例如,在第一行 --> diff(unlist(df1[1,])) )。我只需要每行应用这个,我想使用apply(),但由于某种原因我无法解决。有些日期丢失了,这在我的研究中是允许的。

希望这对你们来说很容易......

df <- structure(list(date1 = structure(c(-10871, -13634, -15937, -15937,
 -290, -2323), class = "Date"), date2 = structure(c(16678, NA,16037, 16659, 
16538, 16626), class = "Date"), date3 = structure(c(16685,16688, NA, 16659,
 16568, 16672), class = "Date"), date4 = structure(c(16701, 16695, 16670,
 16661, 16582, 16672), class = "Date"), date5 = structure(c(16709, 16695, 
16661, 16667, 16619, 16692), class = "Date")), .Names = c("date1","date2", 
"date3", "date4", "date5"), row.names = c("2", "3", "4", "5", "6", "7"), 
class = "data.frame")
df

【问题讨论】:

  • apply 将所有内容转换为character,导致diff 失败。
  • 对于 1,如果您的意思是向下列(使用 diff 的常用方法),您只需要 sapply(df, diff)
  • 如果你的意思是 1 的行,t(apply(df, 1, function(x){diff(as.Date(x))})),虽然你会丢失你的列名。等效,但有点丑,并保留列名:t(sapply(1:nrow(df), function(x){diff(unlist(df[x,]))}))

标签: r date data-manipulation


【解决方案1】:

你可以试试这样的:

apply(df, 1, function(x) identical(sort(as.Date(x)), as.Date(x[!is.na(x)])))

它提供这样的输出,说明特定行日期是否按排序顺序。

    2     3     4     5     6     7 
 TRUE  TRUE FALSE  TRUE  TRUE  TRUE 

【讨论】:

    【解决方案2】:

    我认为这将更简单、更快速地处理长格式:

    dflong <- transform(
      stack(lapply(df, as.numeric)),
      date   = as.Date(values,origin="1970-01-01"),
      group  = seq_len(nrow(df)),
      ind    = NULL,
      values = NULL
    )
    
    dflong <- dflong[order(dflong$group),]
    
    dflong$daysdiff <- with(dflong,
      ave(as.numeric(date), group, FUN=function(x) c(NA,diff(x)) ) 
    )
    
    #         date group daysdiff
    #1  1940-03-28     1       NA
    #7  2015-08-31     1    27549
    #13 2015-09-07     1        7
    #19 2015-09-23     1       16
    #25 2015-10-01     1        8
    #2  1932-09-03     2       NA
    #8        <NA>     2       NA
    #14 2015-09-10     2       NA
    
    aggregate(daysdiff ~ group, data=dflong, function(x) any(x < 0, na.rm=TRUE) )
    
    #  group daysdiff
    #1     1    FALSE
    #2     2    FALSE
    #3     3     TRUE
    #4     4    FALSE
    #5     5    FALSE
    #6     6    FALSE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      相关资源
      最近更新 更多