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
使用apply转换R中的日期并处理NA日期_R_Date_Dataframe_Apply - Fatal编程技术网

使用apply转换R中的日期并处理NA日期

使用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(

这看起来应该容易得多,我相信有人能帮我。我正在尝试使用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(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")