2016-12-15 4 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 символов и не начинаются с либо 12, либо 31. Остальные находятся в

ответ

2

Я думаю, что вы имеете в виду это:.

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

Это идеальное решение. Спасибо! – flightless13wings

1

Мы также можем сделать это, создавая столбец «КАТ» со значениями «OUT», а затем указать «я» с логическим индексом, который только соответствует критериям для случаев «IN» и присваивает() «КАТЕГОРИЯ» к «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 
Смежные вопросы