首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用R中的参考列创建4小时时间间隔

使用R中的参考列创建4小时时间间隔
EN

Stack Overflow用户
提问于 2012-12-17 05:15:45
回答 4查看 294关注 0票数 0

我希望使用数据帧中的参考列创建一个4小时间隔。我有一个像这样的数据框架:

物种<-“ABC”ind<-rep(1:4,each=24)小时<-rep<-rep(seq(0,23,by=1),4)深度<-runif(长度(Ind),1,50)df<-data.framework(cbind(物种,ind,小时,深度))df$深度<-as.数值(df$埋深)

我想要的是创建一个新的列(不改变原始数据框架的信息或尺寸),它可以查看我的小时列(参考列),基于这个值,我将有4小时的时间间隔。例如,如果hour列的值介于0到3之间,那么新列中的值将为0;如果值介于4到7之间,则新列中的值将为4,依此类推。在excel中,我经常使用地板/天花板函数来实现这一点,但在R中,它们并不完全相同。另外,如果有人对此有更简单的建议,那么使用原始的日期/时间数据也可以。在我的原始脚本中,我使用函数as.POSIXct获取日期/时间数据,并从那里获得我的小时列。

我很感激你的帮助

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-17 05:29:22

如何取小时列,将其转换为整数,并使用整数除法来获得结果呢?像这样的东西

代码语言:javascript
运行
复制
# convert hour to integer (hour is currently a col of factors)
i <- as.numeric(levels(df$hour))[df$hour]

# make new column
df$interval <- (i %/% 4) * 4 
票数 2
EN

Stack Overflow用户

发布于 2012-12-17 05:59:04

扩展我的评论,因为我认为你最终会在某个时候寻找真正的日期.

一些小时数据样本:

代码语言:javascript
运行
复制
set.seed(1)
mydata <- data.frame(species = "ABC",
                     ind = rep(1:4, each=24),
                     depth = runif(96, 1, 50),
                     datetime = seq(ISOdate(2000, 1, 1, 0, 0, 0), 
                                    by = "1 hour", length.out = 96))
list(head(mydata), tail(mydata))
# [[1]]
#   species ind    depth            datetime
# 1     ABC   1 14.00992 2000-01-01 00:00:00
# 2     ABC   1 19.23407 2000-01-01 01:00:00
# 3     ABC   1 29.06981 2000-01-01 02:00:00
# 4     ABC   1 45.50218 2000-01-01 03:00:00
# 5     ABC   1 10.88241 2000-01-01 04:00:00
# 6     ABC   1 45.02109 2000-01-01 05:00:00
# 
# [[2]]
#    species ind     depth            datetime
# 91     ABC   4 12.741841 2000-01-04 18:00:00
# 92     ABC   4  3.887784 2000-01-04 19:00:00
# 93     ABC   4 32.472125 2000-01-04 20:00:00
# 94     ABC   4 43.937191 2000-01-04 21:00:00
# 95     ABC   4 39.166819 2000-01-04 22:00:00
# 96     ABC   4 40.068132 2000-01-04 23:00:00

使用cutformat转换数据

代码语言:javascript
运行
复制
mydata <- within(mydata, {
    hourclass <- cut(datetime, "4 hours")             # Find the intervals
    hourfloor <- format(as.POSIXlt(hourclass), "%H")  # Display just the "hour"
})
list(head(mydata), tail(mydata))
# [[1]]
#   species ind    depth            datetime           hourclass hourfloor
# 1     ABC   1 14.00992 2000-01-01 00:00:00 2000-01-01 00:00:00        00
# 2     ABC   1 19.23407 2000-01-01 01:00:00 2000-01-01 00:00:00        00
# 3     ABC   1 29.06981 2000-01-01 02:00:00 2000-01-01 00:00:00        00
# 4     ABC   1 45.50218 2000-01-01 03:00:00 2000-01-01 00:00:00        00
# 5     ABC   1 10.88241 2000-01-01 04:00:00 2000-01-01 04:00:00        04
# 6     ABC   1 45.02109 2000-01-01 05:00:00 2000-01-01 04:00:00        04
# 
# [[2]]
#    species ind     depth            datetime           hourclass hourfloor
# 91     ABC   4 12.741841 2000-01-04 18:00:00 2000-01-04 16:00:00        16
# 92     ABC   4  3.887784 2000-01-04 19:00:00 2000-01-04 16:00:00        16
# 93     ABC   4 32.472125 2000-01-04 20:00:00 2000-01-04 20:00:00        20
# 94     ABC   4 43.937191 2000-01-04 21:00:00 2000-01-04 20:00:00        20
# 95     ABC   4 39.166819 2000-01-04 22:00:00 2000-01-04 20:00:00        20
# 96     ABC   4 40.068132 2000-01-04 23:00:00 2000-01-04 20:00:00        20

请注意,新的“小时类”变量是一个因素,而新的“沙漏”变量是字符,但是即使在within阶段,您也可以轻松地更改这些变量。

代码语言:javascript
运行
复制
str(mydata)
# 'data.frame':    96 obs. of  6 variables:
#  $ species  : Factor w/ 1 level "ABC": 1 1 1 1 1 1 1 1 1 1 ...
#  $ ind      : int  1 1 1 1 1 1 1 1 1 1 ...
#  $ depth    : num  14 19.2 29.1 45.5 10.9 ...
#  $ datetime : POSIXct, format: "2000-01-01 00:00:00" "2000-01-01 01:00:00" ...
#  $ hourclass: Factor w/ 24 levels "2000-01-01 00:00:00",..: 1 1 1 1 2 2 2 2 3 3 ...
#  $ hourfloor: chr  "00" "00" "00" "00" ...
票数 2
EN

Stack Overflow用户

发布于 2012-12-17 05:27:38

提示1,不要使用cbind创建具有不同类型列的data.frame,一切都会被胁迫到相同的类型(在本例中)

在这里,findIntervalcut似乎是合适的。

代码语言:javascript
运行
复制
df <- data.frame(species,ind,hour,depth)
# copy
df2 <- df
df2$fourhour <- c(0,4,8,12,16,20)[findInterval(df$hour, c(0,4,8,12,16,20))]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13908637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档