2014-09-19 19 views
0

我有用於小型教育項目的數據框。如何使用sapply - 開關邏輯

      EVTYPE PROPDMG PROPDMGEXP CROPDMG CROPDMGEXP 
192527 URBAN/SMALL STREAM FLOODING  0.0   5  0    
192938     HEAVY SNOW  1.7   5  0    
193995      HAIL 30.0   5  25   M 
194223   THUNDERSTORM WINDS  0.1   5  0    
195672   THUNDERSTORM WINDS  0.0   5  0    
198497   THUNDERSTORM WINDS 10.0   5  0    

我的目標是創建一個名爲PropAmtDmg的新列,並採用以下格式。 如果PROPDMGEXP = 「5」,則5 * PROPDMG

t1$PropAmtDmg <- ifelse(t1$PROPDMGEXP == "7", t1$PROPDMG * 7, 
         ifelse(t1$PROPDMGEXP == "5", t1$PROPDMG * 5, 
           0)) 

我可能比只有兩個,我提到的更多的情況。 我想在sapply這樣做。

+0

如果你找到可以接受的答案,請記得要接受它 – Alex 2014-09-21 17:17:01

回答

0

您可以集中所有的條件,在一個獨特的一個是這樣的:

transform(t1,PropAmtDmg=ifelse(PROPDMGEXP %in% c(5,7),PROPDMG*PROPDMGEXP,0)) 
1

我想建議這項任務使用data.tabledata.table是一個增強R中固有數據幀的包。它非常快速地爲。這樣做的好處是不會不斷重新複製數據,因此如果數據量很大,這就是內存高效的。我們假設您的數據幀被稱爲dfr

require(data.table) 
set.seed(123) #set the seed so this can be replicated 
dtb = data.table(PROPDMGEXP = sample(1:10, 10), PROPDMG = sample(1:10,10)) #sample data.table 
dtb[(PROPDMGEXP %in% c(5,7)),rslt:=PROPDMG*PROPDMGEXP] 

您完成了。下面是結果:

PROPDMGEXP PROPDMG rslt 
1:   3  10 NA 
2:   8  5 NA 
3:   4  6 NA 
4:   7  9 63 
5:   6  1 NA 
6:   1  7 NA 
7:   10  8 NA 
8:   9  4 NA 
9:   2  3 NA 
10:   5  2 10 

注意:如果你想使所有其他項0,你可以做到這一點,而不是:

dtb[,rslt:=0][(PROPDMGEXP %in% c(5,7)),rslt:=PROPDMG*PROPDMGEXP]