循环遍历df列,与列表进行比较并创建新列

时间:2016-09-28 15:15:31

标签: r regex loops

我有一列数字,例如社会安全号码。我想将此列与不可接受的值列表进行比较(例如1111111112345678)。还有一些我想要执行的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}
}

3 个答案:

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

如果ssnsbadssns是字符向量:

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"