2016-03-07 73 views
0

我試圖在包含日期的一系列列上應用diff()。我感興趣的DATE1-DATE2,DATE2-DATE3之間的差異等所有日期都是按照順序排列的

我感興趣的是:

  1. 日期(天)之間的實際差異
  2. 如果行的所有日期(diff> = 0,按行)

我可以在一系列日期(例如在第一行 - >diff(unlist(df1[1,])))上使用diff()。我只需要應用這個每行,我想用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 
+0

'apply'轉換一切'character',導致'diff'失敗。 – thelatemail

+0

對於1,如果你指的是你的列(通常使用'diff'),你只需要'sapply(df,diff)'。 – alistaire

+0

如果你的行的意思是1,'t(apply(df,1,function(x){diff(as.Date(x))}))',儘管你會失去你的列名。等價但有點醜,並保留列名:'t(sapply(1:nrow(df),function(x){diff(unlist(df [x,]))}))' – alistaire

回答

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 
1

這將是簡單快捷長的形式來處理我認爲:

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