目前,我的数据集包含变量Gbcode
和ncnty
> 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行代码。
答案 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]