2014-09-19 81 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]