2016-12-15 87 views
1

创建一个新的专栏中,我有类似下面的数据表:模式匹配中的R

library(data.table) 
DF <- as.data.table(list(ID = c(125534,"122-343",312343,"12343-343FGV", 1234, 713827), Product = c('Y', NA, NA, 'Z', NA, NA), Type = c(NA, 'D', 'G', NA, NA, NA))) 

      ID Product Type 
1:  125534  Y NA  
2:  122-343  NA D  
3:  312343  NA G  
4: 12343-343FGV  Z NA  
5:   1234  NA NA  
6:  713827  NA NA  

我想创建一个基于ID是如何分类的一个新的命名列类别。 我的不正确的代码如下所示:

DF$CATEGORY <- ifelse(grepl("^12[0-9]|^31[0-9]|", DF$ID), 'IN', 'OUT') 

期望的结果:

  ID Product Type CATEGORY 
1:  125534  Y NA  IN 
2:  122-343  NA D  OUT 
3:  312343  NA G  IN 
4: 12343-343FGV  Z NA  OUT 
5:   1234  NA NA  OUT 
6:  713827  NA NA  OUT 

我需要编写它,以便用字母或符号,超过6个字符短,不与开头的ID 12或31出局。其余的是在

回答

2

我想你的意思是这样的:

DF[, CATEGORY := ifelse(grepl("[^0-9]", ID) | 
          nchar(ID) < 6 | 
          !grepl("^12|^31", ID), 
         "OUT", "IN")] 
+0

这是完美的。谢谢! – flightless13wings

1

我们还可以通过“OUT”价值创造“类别”列中做到这一点,然后指定“我”与逻辑索引只匹配“IN”情况的标准并将“CATEGORY”分配给(“:=”)“IN”

DF[, CATEGORY := "OUT"][grepl("^(12|31)[0-9]{4,}$", ID), CATEGORY := "IN"] 
DF 
#    ID Product Type CATEGORY 
#1:  125534  Y NA  IN 
#2:  122-343  NA D  OUT 
#3:  312343  NA G  IN 
#4: 12343-343FGV  Z NA  OUT 
#5:   1234  NA NA  OUT 
#6:  713827  NA NA  OUT