R- 在日期字段上创建一个应用条件的新字段
R- Create a new field applying condition on a Date field
我是 R 的新手。我正在使用 windows10。我有 R Studio 和 R 版本 3.5.0。
我有一个 table 具有一个字段日期时间格式。
2012-02-02 10:04:00
2012-08-13 11:38:00
2012-07-13 14:00:00
2012-09-26 08:45:00
2012-10-24 05:39:00
2012-02-03 03:33:00
2012-05-02 06:30:00
2012-06-27 09:00:00
2012-07-09 10:16:00
2012-11-22 13:13:00
我需要创建一个新字段来拆分夏季和冬季的数据:
五月到九月是夏季,十月到四月是冬季。根据这个新字段的结果,创建另一个字段来分隔一天中不同时间的数据:夏季的早上、中午、下午和晚上,冬季也是如此。条件为:
夏季
* Morning Summer: 5 am – 10 am
* Noon Summer: 10 am -12 pm
* Afternoon Summer: 12 pm -8 pm
* Night summer 8 pm – 5 am
冬天
* Morning Winter: 7 am – 11 am
* Noon Winter: 11 am -12 pm
* Afternoon Winter: 12 pm -4 pm
* Night Winter 4 pm – 7 am
结果会是这样的:
date | season | time Of Day
'2012-02-02 10:04:00' | winter | morning
'2012-08-13 11:38:00' | summer | noon
'2012-07-13 14:00:00' | summer | afternoon
'2012-09-26 08:45:00' | summer | morning
'2012-10-24 05:39:00' | winter | night
'2012-02-03 03:33:00' | winter | night
'2012-05-02 06:30:00' | summer | morning
'2012-12-27 09:00:00' | winter | morning
'2012-07-09 10:16:00' | summer | morning
'2012-11-22 13:13:00' | winter | afternoon
对于第一种情况,(分为夏季和冬季)我尝试使用 case_when,但没有成功:
df %>%
mutate(season = case_when(
month(.$date) > 4 & month(.$date)< 10 ~ "summer",
month(.$date) < 5 & month(.$date) > 10 ~ "winter"
))
Error in mutate_impl(.data, dots) :
Evaluation error: do not know how to convert 'x' to class
<U+0093>POSIXlt<U+0094>.
我试图找到有关该错误的信息,但老实说我不知道如何解决该问题。我尝试使用库 "lubridate" 但仍然无效。
知道怎么做吗?
df %>% mutate_if(is.character, as.POSIXct) %>%
mutate(season = case_when(
month(date) > 4 & month(date) < 10 ~ "summer",
month(date) < 5 & month(date) > 10 ~ "winter"
))
数据
data <- read.table(text="
date
'2012-02-02 10:04:00'
'2012-08-13 11:38:00'
'2012-07-13 14:00:00'
'2012-09-26 08:45:00'
",header=T, stringsAsFactors = F)
我是 R 的新手。我正在使用 windows10。我有 R Studio 和 R 版本 3.5.0。
我有一个 table 具有一个字段日期时间格式。
2012-02-02 10:04:00
2012-08-13 11:38:00
2012-07-13 14:00:00
2012-09-26 08:45:00
2012-10-24 05:39:00
2012-02-03 03:33:00
2012-05-02 06:30:00
2012-06-27 09:00:00
2012-07-09 10:16:00
2012-11-22 13:13:00
我需要创建一个新字段来拆分夏季和冬季的数据: 五月到九月是夏季,十月到四月是冬季。根据这个新字段的结果,创建另一个字段来分隔一天中不同时间的数据:夏季的早上、中午、下午和晚上,冬季也是如此。条件为:
夏季 * Morning Summer: 5 am – 10 am
* Noon Summer: 10 am -12 pm
* Afternoon Summer: 12 pm -8 pm
* Night summer 8 pm – 5 am
冬天
* Morning Winter: 7 am – 11 am
* Noon Winter: 11 am -12 pm
* Afternoon Winter: 12 pm -4 pm
* Night Winter 4 pm – 7 am
结果会是这样的:
date | season | time Of Day
'2012-02-02 10:04:00' | winter | morning
'2012-08-13 11:38:00' | summer | noon
'2012-07-13 14:00:00' | summer | afternoon
'2012-09-26 08:45:00' | summer | morning
'2012-10-24 05:39:00' | winter | night
'2012-02-03 03:33:00' | winter | night
'2012-05-02 06:30:00' | summer | morning
'2012-12-27 09:00:00' | winter | morning
'2012-07-09 10:16:00' | summer | morning
'2012-11-22 13:13:00' | winter | afternoon
对于第一种情况,(分为夏季和冬季)我尝试使用 case_when,但没有成功:
df %>%
mutate(season = case_when(
month(.$date) > 4 & month(.$date)< 10 ~ "summer",
month(.$date) < 5 & month(.$date) > 10 ~ "winter"
))
Error in mutate_impl(.data, dots) : Evaluation error: do not know how to convert 'x' to class <U+0093>POSIXlt<U+0094>.
我试图找到有关该错误的信息,但老实说我不知道如何解决该问题。我尝试使用库 "lubridate" 但仍然无效。
知道怎么做吗?
df %>% mutate_if(is.character, as.POSIXct) %>%
mutate(season = case_when(
month(date) > 4 & month(date) < 10 ~ "summer",
month(date) < 5 & month(date) > 10 ~ "winter"
))
数据
data <- read.table(text="
date
'2012-02-02 10:04:00'
'2012-08-13 11:38:00'
'2012-07-13 14:00:00'
'2012-09-26 08:45:00'
",header=T, stringsAsFactors = F)