以下是我认为可能的错误:
require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
[1] "1994-05-01"
Run Code Online (Sandbox Code Playgroud)
我的理解是,这应该返回到1994年4月底.请告知这是否确实是一个错误.
我有一个Date,并有兴趣将其表示为一个整数yyyymm形式.目前,我这样做:
get_year_month <- function(d) { return(as.integer(format(d, "%Y%m")))}
mydate = seq.Date(from=as.Date("2012-01-01"), to=as.Date("5012-01-01"), by=1)
system.time(ym <- get_year_month(mydate))
# user system elapsed
# 5.972 0.974 6.951
Run Code Online (Sandbox Code Playgroud)
这对于大型数据集来说非常慢.有更快的方法吗?请提供答案的时间安排,以便轻松比较.使用上面的例子.
我一定错过了一些简单的东西。
我有一个各种日期格式的 data.frame,并且我正在使用 lubridate,它可以很好地处理除月份名称本身之外的所有内容。我无法将月份名称转换为日期时间对象。
> head(dates)
From To
1 June August
2 January December
3 05/01/2013 10/30/2013
4 July November
5 06/17/2013 10/14/2013
6 05/04/2013 11/23/2013
Run Code Online (Sandbox Code Playgroud)
尝试将 June 更改为日期时间对象:
> as_date(dates[1,1])
Error in charToDate(x) :
character string is not in a standard unambiguous format
> as_date("June")
Error in charToDate(x) :
character string is not in a standard unambiguous format
Run Code Online (Sandbox Code Playgroud)
我想根据出生日期计算年龄.
如果我使用lubridate,我会按照R给定出生日期和任意日期的有效和准确的年龄计算(年,月或周)运行以下内容
as.period(new_interval(start = birthdate, end = givendate))$year
但是,当我尝试使用mutatein dplyr来创建新变量时,我遇到了一个错误.
library(dplyr); library(lubridate)
birthdate <- ymd(c(NA, "1978-12-31", "1979-01-01", "1962-12-30"))
givendate <- ymd(c(NA, "2015-12-31", "2015-12-31", NA))
df <- data.frame(
birthdate = birthdate,
givendate = givendate)
Run Code Online (Sandbox Code Playgroud)
以下工作虽然它给出了所有日期和时间值.即年,月,日,小时,分钟和秒.
df<-df %>% mutate(age=as.period(interval(start = birthdate, end = givendate)))
# df
# birthdate givendate age
# 1 <NA> <NA> <NA>
# 2 1978-12-31 2015-12-31 37y 0m 0d 0H 0M 0S
# 3 1979-01-01 2015-12-31 36y 11m 30d 0H 0M 0S
# 4 …Run Code Online (Sandbox Code Playgroud) 我tbl_df有两列StartTime和StopTime。两者都是dttm。
我想将其格式从 更改"%y-%m-%d %h:%m:%s"为"%y%m%d".
我试过了
data <- mutate(data, StartTime = ymd(StartTime), StopTime = ymd(StopTime))
Run Code Online (Sandbox Code Playgroud)
但它返回
警告消息: 1:解析所有格式失败。没有找到格式。2:所有格式都无法解析。没有找到格式。
我该怎么做?
请不要发送其他不使用 lubridate 包的问题。
谢谢
我的目标是根据时间加入两个数据表,dplyr或者data.table特别是在事件发生之前和之后立即获取记录.
在示例数据中,这种情况下的事件是踏板车行程.以下是四次旅行 - 两次由踏板车1拍摄,两次由踏板车2拍摄.
> testScooter
start end id
1: 2018-01-18 22:19:13 2018-01-18 22:26:31 1
2: 2018-01-18 23:29:22 2018-01-18 23:37:53 1
3: 2018-01-18 00:22:02 2018-01-18 00:29:21 2
4: 2018-01-18 00:37:52 2018-01-18 01:06:53 2
Run Code Online (Sandbox Code Playgroud)
在单独的表中是以几乎相等的间隔隔开的记录.本id的比赛中与车标no时,跳闸正在进行中.
> intervals
id time available charge
1 1 2018-01-18 21:31:07 yes 83
2 1 2018-01-18 21:41:07 yes 83
3 1 2018-01-18 21:51:07 yes 83
4 1 2018-01-18 22:01:07 yes 83
5 1 2018-01-18 22:11:07 yes 83
6 1 …Run Code Online (Sandbox Code Playgroud) 披露 - 这是我的第一个 SO 问题,如果这是一个重复的问题,我深表歉意,但我已经找了一段时间,但没有找到这个特定场景的答案
R 版本:3.4.2
我想要一种按特定标识符对数据进行分组的有效方法,然后根据条件进行汇总 - 对每一行动态进行。具体来说,如果另一个实例在当前行的 1 年内,则按 ID 分组,然后总结另一个变量发生的实例(紧急访问)的数量。
以下是数据开始时的示例:
更新以包含 2 个紧急案例的示例
library(lubridate)
> dat <- data.frame("ID" = c(6,6,6,7,7,10,11,11,11),
"Admit_Dt" = as.Date(c('2013-08-12', '2013-12-12', '2016-01-03','2011-04-01', '2011-09-20','2012-02-19','2014-06-24','2014-08-12','2014-09-01')),
"Urgent" = c(0,1,1,1,0,0,1,1,1))
> dat
| ID | Admit_Dt | Urgent|
| 6 | 2013-08-12 | 1|
| 6 | 2013-12-12 | 0|
| 6 | 2016-01-03 | 1|
| 7 | 2011-04-01 | 1|
| 7 | 2011-09-20 | 0|
| 10 | 2012-02-19 | 0|
| 11 …Run Code Online (Sandbox Code Playgroud) 我有一个名为 date 的字符列,其中包含诸如“2015 年 1 月 15 日”之类的数据,我正在尝试使用 as.date 函数将其转换为 ymd 格式,并且我还尝试了 lubridate 包。我尝试过以下方法:
shootings$Date <- ymd(shootings$Date))
Run Code Online (Sandbox Code Playgroud)
和
shootings$Date <- as.Date(as.character(shootings$Date))
Run Code Online (Sandbox Code Playgroud)
如果可能,我希望它看起来像 2013-01-01 (ymd)。但我一直遇到解析问题,或者数据只是 N/A。任何帮助,将不胜感激
我有时间戳指示事件开始的时间和结束的时间:
x <- "00:01:00.000 - 00:01:10.500"
Run Code Online (Sandbox Code Playgroud)
我需要计算事件的持续时间。利用hms从包lubridate以及lapply和strsplit它给我预期的输出:
library(lubridate)
unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[2] - unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[1]
[1] 10.5
Run Code Online (Sandbox Code Playgroud)
但我觉得代码完全不优雅,一点也不简洁。有没有更好的方法来获得持续时间?
编辑:
如果,因为是事实确实如此,有很多超过在短短的一个值x,如:
x <- c("00:01:00.000 - 00:01:10.500", "00:12:12.000 - 00:13:10.500")
Run Code Online (Sandbox Code Playgroud)
我想出了这个解决方案:
timepoints <- lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x)))
duration <- lapply(timepoints, function(x) x[2]-x[1])
duration
[[1]]
[1] 10.5
[[2]]
[1] 58.5
Run Code Online (Sandbox Code Playgroud)
但是,再一次,肯定有一个更好、更短的。
我希望合并润滑间隔,以便如果它们重叠,则从内部第一个时间获取最小值和从内部最后一个时间获取最大值并总结以创建一个跨越整个时间段的新间隔。这是一个reprex:
library(lubridate, warn.conflicts = FALSE)
library(dplyr, warn.conflicts = FALSE)
library(tibble)
dat <- tibble(
animal = rep(c("elk", "wolf", "moose"), each = 2),
date_interval = c(
interval(as.Date("2020-04-01"), as.Date("2020-04-05")),
interval(as.Date("2020-04-10"), as.Date("2020-04-15")),
interval(as.Date("2020-03-01"), as.Date("2020-04-01")),
interval(as.Date("2020-02-15"), as.Date("2020-03-15")),
interval(as.Date("2020-10-01"), as.Date("2020-11-01")),
interval(as.Date("2020-09-15"), as.Date("2020-10-15"))
)
)
dat
#> # A tibble: 6 x 2
#> animal date_interval
#> <chr> <Interval>
#> 1 elk 2020-04-01 UTC--2020-04-05 UTC
#> 2 elk 2020-04-10 UTC--2020-04-15 UTC
#> 3 wolf 2020-03-01 UTC--2020-04-01 UTC
#> 4 wolf 2020-02-15 UTC--2020-03-15 UTC
#> 5 moose 2020-10-01 …Run Code Online (Sandbox Code Playgroud)