У меня есть csv с столбцом, называемым month, как числовым вектором.
Есть ли способ конвертировать это в сокращенное название месяца месяца?
У меня есть csv с столбцом, называемым month, как числовым вектором.
Есть ли способ конвертировать это в сокращенное название месяца месяца?
Взгляните на константу month.abb
. Например, предположим, что у вас есть вектор целых чисел, состоящий из числа месяца, то вы можете использовать его для получения трех букв аббревиатуры от имени месяца, выполнив:
> month <- c(12,3,6,2,3,7)
> month.abb[month]
[1] "Dec" "Mar" "Jun" "Feb" "Mar" "Jul"
Если вам нужна нестандартная аббревиатура месяца, тогда создайте свой собственный вектор поиска в месяц:
#dummy data
df <- data.frame(month = c(1,3,5))
#months vector assuming 1st month is Jan.
mymonths <- c("Jan","Feb","Mar",
"Apr","May","Jun",
"Jul","Aug","Sep",
"Oct","Nov","Dec")
#add abbreviated month name
df$MonthAbb <- mymonths[ df$month ]
#result
df
# month MonthAbb
# 1 1 Jan
# 2 3 Mar
# 3 5 May
Используйте lubridate, создайте вектор, начинающийся с известного месяца:
Тест: для этих чисел месяца предположим, что Jan = 1:
> m = c(1,2,6,7,9,10,11,12,0,99,NA)
делать:
> require(lubridate)
> as.character(month(ymd(010101) + months(m-1),label=TRUE,abbr=TRUE))
[1] "Jan" "Feb" "Jun" "Jul" "Sep" "Oct" "Nov" "Dec" "Dec" "Mar" NA
где (m-1)
- это то, что мы начинаем с даты в январе.
Чтобы узнать, как это сравнивается:
> cbind(m,as.character(month(ymd(010101) + months(m-1),label=TRUE,abbr=TRUE)))
m
[1,] "1" "Jan"
[2,] "2" "Feb"
[3,] "6" "Jun"
[4,] "7" "Jul"
[5,] "9" "Sep"
[6,] "10" "Oct"
[7,] "11" "Nov"
[8,] "12" "Dec"
[9,] "0" "Dec"
[10,] "99" "Mar"
[11,] NA NA
Обратите внимание, что он интерпретирует месячные числа как mod-12, поэтому 99 отображает 3 (99 = 3 + (8 * 12)), а NA возвращает NA. Некоторые из уже опубликованных ответов не будут делать этого. -1 - ноябрь, так как 0 - декабрь.
Если аббревиатуры на английском языке приемлемы, R имеет встроенный постоянный вектор month.abb
имен сокращенного месяца. Просто используйте цифровую дату, чтобы индексировать этот вектор сокращенных имен месяцев. Например, используя фиктивные данные:
set.seed(1)
df <- data.frame(A = runif(10), Month = sample(12, 10, replace = TRUE))
Вот несколько опций для индексации month.abb
через Month
:
> with(df, month.abb[Month])
[1] "Mar" "Mar" "Sep" "May" "Oct" "Jun" "Sep" "Dec" "May" "Oct"
> df <- transform(df, MonthAbb = month.abb[Month])
> df
A Month MonthAbb
1 0.26550866 3 Mar
2 0.37212390 3 Mar
3 0.57285336 9 Sep
4 0.90820779 5 May
5 0.20168193 10 Oct
6 0.89838968 6 Jun
7 0.94467527 9 Sep
8 0.66079779 12 Dec
9 0.62911404 5 May
10 0.06178627 10 Oct
мутировать.
library(dplyr)
df <- mutate(month = month.abb[month])
Быстрее, чем преобразовать.
df <- system.time(transform(df, month = month.abb[month]))
df <- system.time(mutate(df, month = month.abb[month]))