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