R使用chron软件包编程-查找值是否介于两次之间
我尝试在数据框“df.data”中创建一个名为“Day_period”的新列,该列采用以下值: “清晨”,如果“时间”列的值介于“05:00:00”和“08:59:00”之间,则使用“chron”包:R使用chron软件包编程-查找值是否介于两次之间,r,chron,R,Chron,我尝试在数据框“df.data”中创建一个名为“Day_period”的新列,该列采用以下值: “清晨”,如果“时间”列的值介于“05:00:00”和“08:59:00”之间,则使用“chron”包: require(chron) 早起这里有一个方法。鉴于OP的评论,在这里使用cut似乎是一种很好的方法。由于没有可复制的示例,我创建了一个小样本来演示该功能。由于您有一个很大的数据集,我认为您需要更新R并使用data.table包。如果您坚持使用旧版本的R,那么转换方法将是您的选择 # Creat
require(chron)
早起这里有一个方法。鉴于OP的评论,在这里使用cut
似乎是一种很好的方法。由于没有可复制的示例,我创建了一个小样本来演示该功能。由于您有一个很大的数据集,我认为您需要更新R并使用data.table
包。如果您坚持使用旧版本的R,那么转换方法将是您的选择
# Create a sample data
mydf <- data.frame(id = 1:7,
time = c("01:00:00", "05:30:00", "10:00:00",
"14:00:00", "17:00:00", "20:00:00", "23:00:00"),
stringsAsFactors = FALSE)
# id time
#1 1 01:00:00
#2 2 05:30:00
#3 3 10:00:00
#4 4 14:00:00
#5 5 17:00:00
#6 6 20:00:00
#7 7 23:00:00
library(chron)
library(dplyr)
library(data.table)
# Convert character to times
mydf$time <- times(mydf$time)
# Base R approach
transform(mydf,
day_period = cut(time,
breaks = times(c("00:00:00", "05:00:00", "09:00:00",
"13:00:00", "17:00:00", "21:00:00", "23:59:00")),
labels = c("Late night", "Early morning", "Late morning",
"Early afternoon", "Late afternoon", "Evening")))
# dplyr approach
mutate(mydf,
day_period = cut(time,
breaks = times(c("00:00:00", "05:00:00", "09:00:00",
"13:00:00", "17:00:00", "21:00:00", "23:59:00")),
labels = c("Late night", "Early morning", "Late morning",
"Early afternoon", "Late afternoon", "Evening")))
# data.table approach
setDT(mydf)[, day_period := cut(time,
breaks = times(c("00:00:00", "05:00:00", "09:00:00",
"13:00:00", "17:00:00", "21:00:00",
"23:59:00")),
labels = c("Late night", "Early morning", "Late morning",
"Early afternoon", "Late afternoon", "Evening"))][]
# id time day_period
#1: 1 01:00:00 Late night
#2: 2 05:30:00 Early morning
#3: 3 10:00:00 Late morning
#4: 4 14:00:00 Early afternoon
#5: 5 17:00:00 Early afternoon
#6: 6 20:00:00 Late afternoon
#7: 7 23:00:00 Evening
#创建一个示例数据
mydf忘记提到df.data$Times列中的值已经是一个Times()对象这是不可复制的,因为没有提供df.data
。如果DF是仍然存在问题的一小部分行,那么在您的问题中显示dput(DF)
的结果。我认为您不希望在向量子集中使用&&
,因为它只返回一个值,TRUE或FALSE。Thnanks!!事实上,我没有提到我有一个数据框架,其中包含4年来每天每分钟的测量数据。。。我想添加一个列,其中的值对应于日周期…(对此我非常抱歉)…即,如果一行的时间介于“05:00:00”和“08:59:00”之间,则日周期列具有“清晨”值,如果它介于“09:00:00”和“12:59:00”之间,则具有“深夜”值值等@jazzurro我在作为\u数据\u帧
时遇到一些错误<代码>错误:找不到函数“作为数据帧”
。我使用的是dplyr\u 0.3
,但不久前安装了devel版本。您最近安装了吗?我无法安装dplyr软件包,因为我使用的是R版本3.0.2,它不可用。相反,我使用plyr软件包。我已经有了一个数据框,所以我没有使用as_data_frame函数。@Perukas谢谢你的评论。请添加下一次实际数据的小版本,好吗?这样,你就可以得到正确的答案。这也将有助于用户提供好的建议。因为您有一个大的数据集,所以最好更新您的R并使用data.table
包。我将很快更新我的建议。@akrun很抱歉,我没有提到该函数在开发版本中可用。我想我上个月更新了dplyr。此函数是新函数之一。这比常规的data.frame()
要快。
# Create a sample data
mydf <- data.frame(id = 1:7,
time = c("01:00:00", "05:30:00", "10:00:00",
"14:00:00", "17:00:00", "20:00:00", "23:00:00"),
stringsAsFactors = FALSE)
# id time
#1 1 01:00:00
#2 2 05:30:00
#3 3 10:00:00
#4 4 14:00:00
#5 5 17:00:00
#6 6 20:00:00
#7 7 23:00:00
library(chron)
library(dplyr)
library(data.table)
# Convert character to times
mydf$time <- times(mydf$time)
# Base R approach
transform(mydf,
day_period = cut(time,
breaks = times(c("00:00:00", "05:00:00", "09:00:00",
"13:00:00", "17:00:00", "21:00:00", "23:59:00")),
labels = c("Late night", "Early morning", "Late morning",
"Early afternoon", "Late afternoon", "Evening")))
# dplyr approach
mutate(mydf,
day_period = cut(time,
breaks = times(c("00:00:00", "05:00:00", "09:00:00",
"13:00:00", "17:00:00", "21:00:00", "23:59:00")),
labels = c("Late night", "Early morning", "Late morning",
"Early afternoon", "Late afternoon", "Evening")))
# data.table approach
setDT(mydf)[, day_period := cut(time,
breaks = times(c("00:00:00", "05:00:00", "09:00:00",
"13:00:00", "17:00:00", "21:00:00",
"23:59:00")),
labels = c("Late night", "Early morning", "Late morning",
"Early afternoon", "Late afternoon", "Evening"))][]
# id time day_period
#1: 1 01:00:00 Late night
#2: 2 05:30:00 Early morning
#3: 3 10:00:00 Late morning
#4: 4 14:00:00 Early afternoon
#5: 5 17:00:00 Early afternoon
#6: 6 20:00:00 Late afternoon
#7: 7 23:00:00 Evening