2016-12-15 85 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