为变量赋值而不是使用if语句

时间:2017-07-19 23:12:21

标签: r

目前,我的数据集包含变量Gbcodencnty

> str(dt)
'data.frame':   840 obs. of  8 variables:
 $ Gbcode                     : Factor w/ 28 levels "11","12","13",..: 21 22 23 24 25 26 27 28 16 17 ...
 $ ncounty                    : num  0 0 0 0 0 0 0 0 0 0 ...

我想做以下事情:

如果数据记录的Gbcode等于11,则将20分配给ncnty

Gbcode:11,12,13,14,15,21,22,23,31,32,33
对应的ncnty:20,19,198,131,112,102,60,145,22,115,95

我想知道是否有更好的解决方案,而不是写一个if语句,在这种情况下会有很多行,可能少于20行代码。

2 个答案:

答案 0 :(得分:2)

据我所知,这是一个merge操作。使用Gbcode / ncnty数据创建一个小查找表,然后merge将其放入。

# lookup table
lkup <- data.frame(Gbcode=c(11,12,13),ncnty=c(20,19,198))

#example data
dt <- data.frame(Gbcode=c(11,13,12,11,13,12,12))
dt
#  Gbcode
#1     11
#2     13
#3     12
#4     11
#5     13
#6     12
#7     12

合并:

merge(dt, lkup, by="Gbcode", all.x=TRUE)
#  Gbcode ncnty
#1     11    20
#2     11    20
#3     12    19
#4     12    19
#5     12    19
#6     13   198
#7     13   198

有时最好使用match来做这类事情:

dt$ncnty <- lkup$ncnty[match(dt$Gbcode,lkup$Gbcode)]

答案 1 :(得分:-1)

这可能更优雅,但应该做到这一点。

Gbcodes <- as.character(c(11, 12, 13, 14, 15, 21, 22, 23, 31, 32, 33))
ncounties <- c(20, 19, 198, 131, 112, 102, 60, 145, 22, 115, 95)

for(i in 1:length(Gbcodes)) dt$ncounty[dt$Gbcode==Gbcodes[i]] <- dt$ncounties[i]