R 如何使用sapply开关逻辑

R 如何使用sapply开关逻辑,r,switch-statement,sapply,R,Switch Statement,Sapply,我有一个数据框架,用于一个小型教育项目 EVTYPE PROPDMG PROPDMGEXP CROPDMG CROPDMGEXP 192527 URBAN/SMALL STREAM FLOODING 0.0 5 0 192938 HEAVY SNOW 1.7 5 0 193995

我有一个数据框架,用于一个小型教育项目

                            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))

t1$PropAmtDmg您可以将所有条件聚合到一个唯一的条件中,如下所示:

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

我建议使用
data.table
完成此任务<代码>数据。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]

如果你认为答案可以接受,请记住接受它