Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 所有日期都安排好了吗_R_Date_Data Manipulation - Fatal编程技术网

R 所有日期都安排好了吗

R 所有日期都安排好了吗,r,date,data-manipulation,R,Date,Data Manipulation,我正在尝试对一系列包含日期的列应用diff()。我对date1-date2、date2-date3等之间的区别感兴趣 我对以下方面感兴趣: 日期之间的实际差异(天) 如果一行的所有日期都按顺序排列(按行,差异>=0) 我可以在一系列日期上使用diff()(例如,在第一行-->diff(未列出(df1[1,]))。我只需要每行应用这个,我想使用apply(),但由于某些原因我无法计算出来。有些日期不见了,这在我的学习中是允许的 希望这对你们来说很容易 df <- structure(list

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

我对以下方面感兴趣:

  • 日期之间的实际差异(天)
  • 如果一行的所有日期都按顺序排列(按行,差异>=0)
  • 我可以在一系列日期上使用diff()(例如,在第一行-->
    diff(未列出(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
    

    df您可以尝试以下方法:

    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 
    

    您可以尝试以下方法:

    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 
    

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

    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
    

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

    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
    

    dflong
    apply
    将所有内容转换为
    character
    ,导致
    diff
    失败。对于1,如果您指的是列(通常使用
    diff
    ),您只需要
    sapply(df,diff)
    。如果您指的是1的行,
    t(apply(df,1,函数(x){diff(as.Date(x))
    ,虽然你会失去你的列名。等效,但有点难看,并保留列名:
    t(sapply(1:nrow(df),function(x){diff(unlist(df[x,]))}
    apply
    将所有内容转换为
    字符
    ,导致
    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,]))})