2017-01-26 63 views
-3
### The sample data 

df <- data.frame(months = c('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'), 
       values = sample(100:200, 12, replace = TRUE)) 

### Load the library needed 

library(dplyr) 

我嘗試以下方法三個字母的月份(如一月)轉換爲日期:轉換三個字母本月至今類

df.1 <- mutate(df, year = 2015) 
df.1 <- mutate(df.1, dates = sapply(months, function(x) grep(paste("(?i)", x, sep = ""), month.abb))) 
df.1 <- mutate(df.1, dates1 = paste(dates, year, sep = "-")) 
df.1 <- mutate(df.1, dates2 = as.Date(df.1$dates1, "%m-%Y")) 

dates2列結果到NA,但是當我檢查了結構,結果是:

> str(df.1) 
'data.frame': 12 obs. of 6 variables: 
$ months: Factor w/ 12 levels "apr","aug","dec",..: 5 4 8 1 9 7 6 2 12 11 ... 
$ values: int 141 147 176 189 113 181 149 114 121 191 ... 
$ year : num 2015 2015 2015 2015 2015 ... 
$ dates : int 1 2 3 4 5 6 7 8 9 10 ... 
$ dates1: chr "1-2015" "2-2015" "3-2015" "4-2015" ... 
$ dates2: Date, format: NA NA NA NA .. 

有沒有辦法給months列轉換爲Date類?怎麼樣?感謝您的幫助。

+0

@Jota你確定這是一個很好的欺騙對象,因爲它與數字月份交易(格式'「YYYY-MM」') ?實際Q是關於縮寫的月份名稱。 – Uwe

+0

請參見[convert mmm to R in](http://stackoverflow.com/questions/6549239/convert-mmm-to-numeric-in-r)或[將月份縮寫轉換爲數字月份,R ](http://stackoverflow.com/questions/6987478/convert-a-month-abbreviation-to-a-numeric-month-in-r) – Uwe

+0

@UweBlock公平點。我選擇了這個目標,因爲我看到在嘗試的解決方案中,「Jan」已經被轉換爲一個數字,並且問題出現的點將「1-2015」傳遞給「as.Date」。 – Jota

回答

3

據我所知,您不能使用as.Date或任何類似的函數將月份轉換爲日期實體。你必須提供更多的信息,如一天,即

as.Date("26jan","%d%b") 
[1] "2017-01-26" 

或者使用功能,如:

library(zoo) 
as.yearmon("jan","%b") 
[1] "Jan 2017" 

所以對你的表達將是,不知道有關的目的雖然代碼,但在這裏你去:

df <- data.frame(months = c('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'), 
       values = sample(100:200, 12, replace = TRUE)) 


df.1 <- mutate(df, year = 2015) 
df.1 <- mutate(df.1, dates = sapply(months, function(x) grep(paste("(?i)", x, sep = ""), month.abb))) 
df.1 <- mutate(df.1, dates1 = paste(year,dates, sep = "-")) 
df.1 <- mutate(df.1, dates2 = yearmon(df.1$dates1, "%Y-%m")) 

as.yearmon(df.1$dates1) 

[1] "Jan 2015" "Feb 2015" "Mar 2015" "Apr 2015" "May 2015" "Jun 2015" "Jul 2015" "Aug 2015" "Sep 2015" "Oct 2015" 
[11] "Nov 2015" "Dec 2015" 
+0

是的,但在我的數據中,我嘗試轉換'日期1'列,這是'日期'和'年份'列的組合,反過來('日期1')成爲一個字符類。無論如何,謝謝你指出。 :-) –

+0

謝謝你的努力,我很感激。目的是將該列用於進一步的趨勢分析以及其他使用日期類的列。 :-) –

-1

感謝Nadizan's answer您指出的day方面,所以我重新建造我的語法,就像這樣:

df.1 <- mutate(df, year = "1-2015") 
df.1 <- mutate(df.1, dates = sapply(months, function(x) grep(paste("(?i)", x, sep = ""), month.abb))) 
df.1 <- mutate(df.1, dates1 = paste(dates, year, sep = "-")) 
df.1 <- mutate(df.1, dates2 = as.Date(df.1$dates1, "%m-%d-%Y")) 

然後我檢查了結構,結果是:

> str(df.1) 
'data.frame': 12 obs. of 6 variables: 
$ months: Factor w/ 12 levels "apr","aug","dec",..: 5 4 8 1 9 7 6 2 12 11 ... 
$ values: int 110 154 200 110 105 179 139 173 153 197 ... 
$ year : chr "1-2015" "1-2015" "1-2015" "1-2015" ... 
$ dates : int 1 2 3 4 5 6 7 8 9 10 ... 
$ dates1: chr "1-1-2015" "2-1-2015" "3-1-2015" "4-1-2015" ... 
$ dates2: Date, format: "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01" ... 
+1

複製@nadizan答案的目的是什麼? – Uwe

+2

請不要發佈「謝謝」作爲答案。如果您對發佈的答案感到滿意,您可以接受它。你可以評論你的帖子,一旦你有足夠的代表,你就可以評論任何帖子。 – Cath