模式匹配以在 R 中创建一个新列

Pattern Matching to create a new column in R

我有一个数据 table 如下所示:

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 的分类方式创建一个名为 CATEGORY 的新列。 我的错误代码如下所示:

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 开头的 ID 都被淘汰。剩下的在.

我想你是这个意思:

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

我们还可以通过创建具有 "OUT" 值的 'CATEGORY' 列,然后指定 'i' 具有仅匹配 "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