我刚学习R语言,我有一个数据框,其中包含日期时间变量。每天记录一小时的温度,日期时间格式为YYYY-MM-DD 00:00:00。现在我想将时间转换为范围从0到23的因子,每天一个因子。因此,对于每一天,我的新列应该有0到23个因子。谁能帮我解决这个问题?我的2015-01-01 00:00:00应该给我0,而2015-01-01 01:00:00应该给我1,依此类推。另外,我的2015-01-02 00:00:00应该再次是0。
POSIXlt
对象。一旦你有了它,你就可以直接获取小时数,方法如下:> timestamp <- as.POSIXlt("2015-01-01 00:00:00")
> timestamp
[1] "2015-01-01 MYT"
> timestamp$hour
[1] 0
@Sairam,除了@jazzurro使用的'dplyr'(像jazzurro一样,许多R-insitas经常使用)之外...如果您需要/想要一种简单而强大的方式来操作日期,请鼓励您熟悉另一个软件包:'lubridate.'
lubridate使处理日期变得轻松。希望这可以帮助您的项目。最好的祝愿。
mydf <- data.frame(id = c(1,1,1,2,2,1,1),
event = c("start", "valid", "end", "start", "bad", "start", "bad"),
time = as.POSIXct(c("2015-05-16 20:46:53", "2015-05-16 20:46:56", "2015-05-16 21:46:59",
"2015-05-16 22:46:53", "2015-05-16 22:47:00", "2015-05-16 22:49:05",
"2015-05-16 23:49:09"), format = "%Y-%m-%d %H:%M:%S"),
stringsAsFactors = FALSE)
library(dplyr)
mutate(mydf, group = factor(format(time, "%H")))
# id event time group
#1 1 start 2015-05-16 20:46:53 20
#2 1 valid 2015-05-16 20:46:56 20
#3 1 end 2015-05-16 21:46:59 21
#4 2 start 2015-05-16 22:46:53 22
#5 2 bad 2015-05-16 22:47:00 22
#6 1 start 2015-05-16 22:49:05 22
#7 1 bad 2015-05-16 23:49:09 23
使用POSIXlt
的Tim的答案可能是最好的选择,但以下是一种正则表达式的方式:
> times <- c("2015-01-01 00:00:00", "2015-01-01 01:00:00", "2015-01-02 00:00:00")
> regmatches(times, regexpr("(?<=-\\d{2} )\\d{2}", times, perl=TRUE))
[1] "00" "01" "00"
通过提取的小时数,您可以根据需要将它们转换为因子或整数。
substr(times,12,13)
。 - thelatemail
dplyr
来添加一个变量? - thelatemaildplyr
并使用它了。 :) - jazzurrohour(mydf$time)
。 - akrun