是否有任何 R 函数可用于查找星期几的索引,例如星期日为 1,星期一为 2,等等?
Is there any R function for finding index of days of week, e.g., 1 for Sunday, 2 for Monday, & so on?
我的数据框的两列 [比如 col1 和 col5] 包含星期几,例如星期日、星期一……
我想将这些列转换为它们各自的索引,例如 '1' 表示“星期日”,'2' 表示 'Monday', 。 ..等等。
目前,我正在使用 ifelse,但我相信在 R 中可能有 一种有效的方法来做同样的事情。
示例代码:
df$col1 = ifelse(df$col1=="Sunday",1,df$col1)
df$col1 = ifelse(df$col1=="Monday",2,df$col1)
....
df$col1 = ifelse(df$col1=="Saturday",7,df$col1)
col5 的类似代码
df$col5 = ifelse(df$col5=="Sunday",1,df$col5)
df$col5 = ifelse(df$col5=="Monday",2,df$col5)
....
df$col5 = ifelse(df$col5=="Saturday",7,df$col5)
我试图在 lubridate 包中寻找合适的功能,但找不到。
您可以使用匹配:
dow <- c('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')
df$col1 <- match(df$col1, dow)
比匹配更简单的是我们可以称之为 "lookup table",或者这里只是一个命名向量:
R> dow <- 1:7
R> names(dow) <- c("Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday")
R> dow["Thursday"]
Thursday
5
R> unname(dow["Thursday"]) # if you want to drop the name
[1] 5
R>
您可以通过 switch
语句以编程方式执行相同的操作。
编辑: 根据要求。
## switch
dow <- function(d) {
switch(d,
Sunday = 1,
Monday = 2,
Tuesday = 3,
Wednesday = 4,
Thursday = 5,
Friday = 6,
Saturday = 7)
使用示例
R> dow("Monday")
[1] 2
R> dow("Friday")
[1] 6
R>
}
设置一个因素的水平设置数字 as.numeric returns。
df= data.frame(col1 = c("Friday", "Monday", "Wednesday"), col5 = c("Tuesday", "Saturday", "Monday"))
df$col1 = factor(df$col1, levels=c("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
df$col1 = as.numeric(df$col1)
df$col5 = factor(df$col5, levels=c("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
df$col5 = as.numeric(df$col5)
您可以使用 lubridate 来执行此操作:
lubridate::wday(lubridate::today(),
week_start = 1,
label = TRUE)
[1] Fr
Levels: Mo < Di < Mi < Do < Fr < Sa < So
我的数据框的两列 [比如 col1 和 col5] 包含星期几,例如星期日、星期一……
我想将这些列转换为它们各自的索引,例如 '1' 表示“星期日”,'2' 表示 'Monday', 。 ..等等。 目前,我正在使用 ifelse,但我相信在 R 中可能有 一种有效的方法来做同样的事情。
示例代码:
df$col1 = ifelse(df$col1=="Sunday",1,df$col1)
df$col1 = ifelse(df$col1=="Monday",2,df$col1)
....
df$col1 = ifelse(df$col1=="Saturday",7,df$col1)
col5 的类似代码
df$col5 = ifelse(df$col5=="Sunday",1,df$col5)
df$col5 = ifelse(df$col5=="Monday",2,df$col5)
....
df$col5 = ifelse(df$col5=="Saturday",7,df$col5)
我试图在 lubridate 包中寻找合适的功能,但找不到。
您可以使用匹配:
dow <- c('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')
df$col1 <- match(df$col1, dow)
比匹配更简单的是我们可以称之为 "lookup table",或者这里只是一个命名向量:
R> dow <- 1:7
R> names(dow) <- c("Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday")
R> dow["Thursday"]
Thursday
5
R> unname(dow["Thursday"]) # if you want to drop the name
[1] 5
R>
您可以通过 switch
语句以编程方式执行相同的操作。
编辑: 根据要求。
## switch
dow <- function(d) {
switch(d,
Sunday = 1,
Monday = 2,
Tuesday = 3,
Wednesday = 4,
Thursday = 5,
Friday = 6,
Saturday = 7)
使用示例
R> dow("Monday")
[1] 2
R> dow("Friday")
[1] 6
R>
}
设置一个因素的水平设置数字 as.numeric returns。
df= data.frame(col1 = c("Friday", "Monday", "Wednesday"), col5 = c("Tuesday", "Saturday", "Monday"))
df$col1 = factor(df$col1, levels=c("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
df$col1 = as.numeric(df$col1)
df$col5 = factor(df$col5, levels=c("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
df$col5 = as.numeric(df$col5)
您可以使用 lubridate 来执行此操作:
lubridate::wday(lubridate::today(),
week_start = 1,
label = TRUE)
[1] Fr
Levels: Mo < Di < Mi < Do < Fr < Sa < So