2017-05-08 199 views
1

我使用一系列if語句來檢查Year是否等於某個值,然後計算語句。有沒有更高效,更快捷的方法來執行以下內容而不是使用if語句?替代R語句中的if語句

for (i in 1:length(O$Year)) 
{ 
    if (Year[i] == "2012") { 
     O$SD[i] = C[i]/5408666 
    } else if (Year[i] == "2013") { 
     O $SD[i] = C[i]/5300759 
    } else if (Year[i] == "2014") { 
     O$SD[i] = C[i]/5410924 
    } else if (Year[i] == "2015") { 
     O$SD[i] = C[i]/5446029 
    } else if (Year[i] == "2016") { 
     O$SD[i] = C[i]/5480869 
    } else 
     O$SD[i] = C[i] 
} 

**Data set named O** 
    **SD Year C** 
    43 2012 4 
    23 2012 5 
    12 2014 3 
    53 2014 3 
+1

那麼[switch](https://stat.ethz.ch/R-manual/R-devel/library/base/html/switch.html)怎麼樣? – user2100721

回答

0

我很想看看如何與switch()做到這一點,我通常會用dplyr管道,以避免必須如此頻繁輸入data.frame的名字,但這裏是我會在這裏做的:

O$SD <- ifelse(O$Year == '2012', O$C/5408666, 
       ifelse(O$Year == '2013', O$C/5300759, 
         ifelse(O$Year == '2014', O$C/5410924, 
          ifelse(O$Year == '2015', O$C/5446029, 
            ifelse(O$YEar == '2016', O$C/5480869, O$C)))) 

它不會節省大量的打字量,但它確實節省了for循環。

+0

您也可以使用'with'來避免重複鍵入數據框名稱。 – Gregor

+0

'switch'爲第一個參數取一個值,所以你必須把它包裝在'for'循環中。這通常是我會避免的。 – Benjamin

1

這個怎麼樣?

tmp <- data.frame(year = c("2012","2013","2014","2015","2016"), 
denominator = c(5408666,5300759,5410924,5446029,5480869)) 

for(i in 1:nrow(O)){ 
O[i,4] <- O$C[i]/tmp[which(as.character(tmp$year)==O$Year[i]),2] 
} 
1

可以使用dplyr::recodeswitch工作方式類似:

虛擬數據:

library(dplyr) 

O <- read.table(text="SD Year C 
    43 2012 4 
23 2012 5 
12 2014 3 
53 2014 3", header=TRUE, stringsAsFactors=FALSE) 

重新編碼:注意反引號``圍繞要被替換的值:

O %>% mutate(SD= recode(Year,`2012`=C/540866, 
          `2014`=C/5410924)) 

結果:

  SD Year C 
1 7.395547e-06 2012 4 
2 9.244434e-06 2012 5 
3 5.544340e-07 2014 3 
4 5.544340e-07 2014 3 
0

我認爲如果您使用match將分母分配給每一行,您會發現效率最高。

match_year_row <- match(O$year, 2012:2016) 

O$denominator <- c(5408666,5300759,5410924,5446029,5480869)[match_year_row] 
O$denominator[is.na(O$denominator)] <- 1 
O$SD <- with(O, C/denominator)