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]
如果你认为答案可以接受,请记住接受它