使用apply转换R中的日期并处理NA日期
这看起来应该容易得多,我相信有人能帮我。我正在尝试使用lubridate包中的floor_date()将每个日期从data.frame日期更改为各自月份的第一个日期,但是其中一些日期是NAs。我不想用虚拟日期代替NAs 我尝试了以下方法:使用apply转换R中的日期并处理NA日期,r,date,dataframe,apply,R,Date,Dataframe,Apply,这看起来应该容易得多,我相信有人能帮我。我正在尝试使用lubridate包中的floor_date()将每个日期从data.frame日期更改为各自月份的第一个日期,但是其中一些日期是NAs。我不想用虚拟日期代替NAs 我尝试了以下方法: library(lubridate) a<-c(as.Date("2011-05-04"), as.Date("2011-06-12")) b<-c(as.Date("2012-03-01"), NA) test <- data.frame(
library(lubridate)
a<-c(as.Date("2011-05-04"), as.Date("2011-06-12"))
b<-c(as.Date("2012-03-01"), NA)
test <- data.frame(a,b)
apply(test, 1, function(y) sapply(y, function(x) if(!is.na(x)) floor_date(x, "month") else na.pass(x)))
apply(test, 1, function(y) ifelse(!is.na(y)), floor_date(y, "month"), na.pass(y))
第二个调用返回:
Error in update.default(x, mdays = 1, hours = 0, minutes = 0, seconds = 0) :
need an object with call component
谢谢你的帮助 我不知道lubridate的情况,但您可以通过base R提供的出色的数据处理设施轻松做到这一点 这里有一个小助手函数,可以毫无怨言地执行所需的计算:
firstOfMonth <- function(dates) {
as.Date(strftime(dates, format="%Y-%m-01"))
}
firstOfMonth(a)
# [1] "2011-05-01" "2011-06-01"
firstOfMonth(b)
# [1] "2012-03-01" NA
data.frame(lapply(test, firstOfMonth))
# a b
# 1 2011-05-01 2012-03-01
# 2 2011-06-01 <NA>
firstOfMonth这个怎么样
my_floor_date <- function(x,...) {idx <- !is.na(x); x[idx] <- floor_date(x[idx], ...); x}
transform(test, a=my_floor_date(a, "month"), b=my_floor_date(b, "month"))
我的楼层日期你试过package zoo吗
library(zoo)
a<-c(as.Date("2011-05-04"), as.Date("2011-06-12"))
b<-c(as.Date("2012-03-01"), NA)
test <- data.frame(
"a" = as.Date(as.yearmon(a)),
"b" = as.Date(as.yearmon(b))
)
图书馆(动物园)
a如果你想像你尝试的那样在一行中完成它,这将起作用:
data.frame(lapply(test,function (y) (as.Date(sapply(y,function(x) if (is.na(x)) NA else floor_date(x,'month'))))))
这里真正的问题是lubridate
函数本身,它应该允许您向update.Date
传递一个参数,告诉它忽略NA。上面的strftime
解决方案绝对是最干净的
此外,如评论中所述,解决方案不起作用的原因是您使用了apply
,而不是lappy
Loor_date()中的NA错误已在lubridate 1.1.0中修复,该软件已于今天发送给CRAN。S3更新方法中的日期错误仍然存在(在开发版本中已修复)。同时,
floor_date(as.POSIXlt(test$b), unit = "month")
将起作用。所有这些的最大问题是,apply
将强制执行矩阵和所有属性(包括构成R“Date”的内容)日期将丢失。您需要在列上使用lappy
,而不是在行上使用。是否只想将每个日期转换为每月的第一个日期?如果是这样,则通过一次一行地处理行是没有意义的,这就是应用的(测试,1,…)
可以。您应该做一些类似于data.frame(lappy(test,…)的事情
。这将取测试的每一列,依次对每一列执行计算,然后将得到的列列表转换回data.frame.doh!我知道我把事情弄得太复杂了!非常感谢。还注意到Lappy在这种情况下比apply工作得更好。apply返回数值向量是的。它看起来像lubridate的floor_Date()
根本不是设计用来处理NA
s的,所以你最好只使用我的代码或类似的东西。(尝试floor_Date(b)
和你的向量b
看看我的意思。)
floor_date(as.POSIXlt(test$b), unit = "month")