2012-11-02 28 views
5

Có ai biết cách tăng tốc chạy lệnh sau không? Tôi muốn thay thế các giá trị "tháng" bằng số bằng một chuỗi ký tự ... ví dụ: tháng 1 chuyển đến "Jul".tăng tốc chạy nếu .. else lặp lại trong R

Lệnh này thực sự rất chậm vì khung dữ liệu mà tôi đang cố gắng triển khai trên đó là rất lớn!

for (i in 1:length(CO2$month)){ 
    if(CO2$month[i]=='1') {CO2$months[i]<-'Jul'} else 
    if(CO2$month[i]=='2') {CO2$months[i]<-'Aug'} else 
    if(CO2$month[i]=='3') {CO2$months[i]<-'Sept'} else 
    if(CO2$month[i]=='4') {CO2$months[i]<-'Oct'} else 
    if(CO2$month[i]=='5') {CO2$months[i]<-'Nov'} else 
    if(CO2$month[i]=='6') {CO2$months[i]<-'Dec'} else 
    if(CO2$month[i]=='7') {CO2$months[i]<-'Jan'} else 
    if(CO2$month[i]=='8') {CO2$months[i]<-'Feb'} else 
    if(CO2$month[i]=='9') {CO2$months[i]<-'Mar'} else 
    if(CO2$month[i]=='10') {CO2$months[i]<-'Apr'} else 
    if(CO2$month[i]=='11') {CO2$months[i]<-'May'} else 
    if(CO2$month[i]=='12') {CO2$months[i]<-'Jun'} 
} 

Trả lời

7

Bạn có thể làm điều đó mà không có một vòng lặp và không có if-else:

set.seed(21) 
CO2 <- data.frame(month=as.character(sample(1:12,24,TRUE)), 
    stringsAsFactors=FALSE) 
MonthAbbRotated <- month.abb[c(7:12,1:6)] 
CO2$months <- MonthAbbRotated[as.numeric(CO2$month)] 

Nếu cột month của bạn là không thực sự nhân vật, điều này thậm chí còn dễ dàng hơn:

set.seed(21) 
CO2 <- data.frame(month=sample(1:12,24,TRUE)) 
MonthAbbRotated <- month.abb[c(7:12,1:6)] 
CO2$months <- MonthAbbRotated[CO2$month] 
+0

Thật tuyệt khi biết thủ thuật này! – Alex

+2

Ông có độ trễ 6 tháng ở đây trong câu hỏi của mình: 1 tương ứng với "Tháng Bảy" và không phải là "Tháng Một". Vì vậy, một cái gì đó giống như 'month.abb [(as.numeric (CO2 $ month) +6) %% 12]' sẽ sửa cho độ trễ. – plannapus

+0

@plannapus: tuyệt vời bắt, sẽ chỉnh sửa rằng vào câu trả lời của tôi –

1
month =c("jul","aug","sep","oct","nov","dec","jan","feb","mar","apr","may","jun") 

for (i in 1:length(CO2$month)){ CO2$month[i] = month[as.integer(CO2$month[i])]} 
4

Tôi có thể thiếu một cái gì đó, nhưng tại sao không chỉ sử dụng một yếu tố?

CO2$month <- factor(CO2$month, levels=1:12, labels=c("Jul","Aug","Sept","Oct","Nov","Dec","Jan","Feb","Mar","Apr","May","Jun"))

+0

+1 rất thông minh, nhưng người hỏi sẽ cần bọc nó trong 'as.character' để có kết quả tương tự như ví dụ của chúng. Một phiên bản ngắn hơn một chút: 'yếu tố (CO2 $ tháng, cấp = c (7: 12,1: 6), nhãn = month.abb)' –

+0

Đó là sự thật, nhưng anh ta có thể không thực sự quan tâm về sự khác biệt giữa cấp độ nhân tố và một chuỗi. Nếu anh ta không yếu tố cũng nên có thêm không gian hiệu quả (không chắc chắn nếu R thực tập dây). Nếu anh ta làm, sau đó anh ta có thể bọc nó trong as.character như bạn chỉ ra – frankc

+0

xem bình luận của tôi để trả lời của bạn về month.abb. Op không * khá * sử dụng bản đồ đó, mặc dù có lẽ anh ta có nghĩa là để – frankc

1

Điều này cũng sẽ làm việc, ngay cả khi nó là một cái gì đó, nơi có không phải là một chức năng hữu ích như month.abb sử dụng:

Mon <- data.frame(month=1:12, months=c("Jul","Aug","Sept","Oct","Nov","Dec", 
           "Jan","Feb","Mar","Apr","May","Jun")) 
CO2 <- merge(CO2, Mon, by="month", all.x=TRUE) 
+0

'month.abb' không phải là một hàm, nó chỉ là một đối tượng được xác định trước. –

+0

Đừng nghĩ rằng điều đó tạo nên sự khác biệt, nhưng thật tuyệt. –

Các vấn đề liên quan