2011-07-01 39 views
12

Tôi đã được cung cấp một csv với một cột được gọi là tháng làm biến char với ba chữ cái đầu tiên của tháng. Ví dụ:Chuyển đổi tháng mmm thành số

"Jan", "Feb","Mar",..."Dec" 

Có cách nào để chuyển đổi số này thành biểu diễn dạng số của tháng, từ 1 đến 12 hoặc thậm chí là loại có định dạng ngày không?

+2

Tín dụng bổ sung: cung cấp câu trả lời phù hợp nếu chữ viết tắt của tháng không bằng tiếng Anh! (ví dụ "Jan", "Fev", "Mar", "Avr", "Mai", ...) [Gợi ý: bạn có thể làm điều này bằng cách tạm thời chuyển miền địa phương của hệ thống và sử dụng 'as.Date' bằng' % b' format ...] –

Trả lời

31

Sử dụng match và vectơ được xác định trước month.abb:

tst <- c("Jan","Mar","Dec") 
match(tst,month.abb) 
[1] 1 3 12 
13

Bạn có thể sử dụng được xây dựng trong vector month.abb để kiểm tra chống lại khi chuyển sang một con số, ví dụ:

mm <- c("Jan","Dec","jan","Mar","Apr") 

sapply(mm,function(x) grep(paste("(?i)",x,sep=""),month.abb)) 
Jan Dec jan Mar Apr 
    1 12 1 3 4 

Các cấu trúc grep mất chăm sóc sự khác biệt về cách viết hoa. Nếu không cần thiết,

match(mm,month.abb) 

hoạt động bình thường.

Nếu bạn cũng có một ngày và một cột năm, bạn có thể sử dụng bất kỳ chức năng chuyển đổi, sử dụng các mã thích hợp (xem thêm ?strftime)

ví dụ

mm <- c("Jan","Dec","jan","Mar","Apr") 
year <- c(1998,1998,1999,1999,1999) 
day <- c(4,10,3,16,25) 

dates <- paste(year,mm,day,sep="-") 

strptime(dates,format="%Y-%b-%d") 
[1] "1998-01-04" "1998-12-10" "1999-01-03" "1999-03-16" "1999-04-25" 
+0

Cảm ơn Joris, điều này cũng hữu ích. Tôi sẽ phải dán cột để có được một ngày thực tế cho một chuỗi thời gian với nó. – John

2

Một vài tùy chọn sử dụng :

vec <- c("Jan","Dec","Jan","Apr") 

> Months <- 1:12 
> names(Months) <- month.abb 
> unname(Months[vec]) 
[1] 1 12 1 4 

và/hoặc

> match(vec, month.abb) 
[1] 1 12 1 4 
Các vấn đề liên quan