我有一列数字,例如社会安全号码。我想将此列与不可接受的值列表进行比较(例如11111111
或12345678
)。还有一些我想要执行的grepl操作,比如前三个数字不能是000
。下面是我认为代码看起来像的骨架,我更喜欢for循环逻辑。
ssns <- c(12343210,23454321,34565432,11111111)
badssns <- c(11111111,22222222)
for( i in 1:length(ssns)) {
if(ssns[i] %in% badssn_list) {
ssns$newcolumn==BADSSN
}
else if( grepl(first 3 numbers 0){
ssns$newcolumn==BADSSN
}
else{ssns$newcolumn==GOODSSN}
}
答案 0 :(得分:5)
只需使用嵌套的ifelse
即可完成作业:
ssns$newcolumn <- ifelse(ssns$num %in% badssns, 'BADSSN',
ifelse(substr(ssns$num,1,3)=='000', 'BADSSN', 'GOODSSN'))
或更短的使用OR语句(|
):
ssns$newcolumn <- ifelse(ssns$num %in% badssns| substr(ssns$num,1,3)=='000', 'BADSSN', 'GOODSSN')
给出:
> ssns
num newcolumn
1 12343210 GOODSSN
2 23454321 GOODSSN
3 34565432 GOODSSN
4 11111111 BADSSN
5 00065432 BADSSN
使用过的数据:
ssns <- data.frame(num = c('12343210','23454321','34565432','11111111','00065432'), stringsAsFactors = FALSE)
badssns <- c('11111111','22222222')
答案 1 :(得分:0)
您似乎对计算机编程有一些经验,但可能是R的新手。在大多数情况下,最好的R程序不使用for
循环。
这是实现您所描述内容的更多R
方法。 <{1}}和ssns
很长时间会更快。
badssns
您可能希望使用字符串而不是数字 - 也许您担心使用字母“oh”代替数字“0”。这种方法也适用于这种情况。有点出乎意料地(对我而言),当ssns<-c(12343210,23454321,34565432,11111111)
badssns<-c(11111111,22222222)
good.idxs <- is.na(match(ssns, badssns))
good.ssns <- ssns[good.idxs]
是一个字符向量而ssns
是一个数字向量,反之亦然时,它甚至可以工作!
答案 2 :(得分:0)
如果ssns
和badssns
是字符向量:
ssns<-c("12343210","23454321","34565432","11111111","00023456")
badssns<-c("11111111","22222222")
然后你只能使用一个ifelse
:
result <- ifelse(ssns %in% badssns | grepl("^0{3}",ssns), "BADSSNS", "GOODSSNS")
##[1] "GOODSSNS" "GOODSSNS" "GOODSSNS" "BADSSNS" "BADSSNS"