所有日期都是按照顺序排列的
问题描述:
我试图在包含日期的一系列列上应用diff()。我感兴趣的DATE1-DATE2,DATE2-DATE3之间的差异等所有日期都是按照顺序排列的
我感兴趣的是:
- 日期(天)之间的实际差异
- 如果行的所有日期(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
答
你可以尝试这样的事:因为这
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
'apply'转换一切'character',导致'diff'失败。 – thelatemail
对于1,如果你指的是你的列(通常使用'diff'),你只需要'sapply(df,diff)'。 – alistaire
如果你的行的意思是1,'t(apply(df,1,function(x){diff(as.Date(x))}))',尽管你会失去你的列名。等价但有点丑,并保留列名:'t(sapply(1:nrow(df),function(x){diff(unlist(df [x,]))}))' – alistaire