0

模式列表如下所示:

pattern <- c('aaa','bbb','ccc','ddd')

X 来自 df 看起来像:

df$X <- c('aaa-053','aaa-001','aab','bbb')

我试图做的:使用agrep根据df$X在pattern中找到匹配的名称,然后根据匹配结果为现有列'column2'赋值,例如,如果'aaa-053'匹配'aaa' ,那么 'aaa' 将是 'column2' 中的值,如果不匹配,则返回该列中的 na。

for (i in 1:length(pattern)) {
 match <- agrep(pattern, df$X, ignore.case=TRUE, max=0)
 if agrep = TRUE {
   df$column2 <- pattern
 } else {df$column2 <- na
 }
}

df 中的理想 column2 如下所示:

'aaa','aaa',na,'bbb'
4

1 回答 1

0

agrep就其本身而言,您并不能确定在倍数匹配时使用哪个。例如,

agrep(pattern[1], df$x)
# [1] 1 2 3

这对前两个有意义,但第三个不在您的预期值之内。同样,它可能为给定的字符串选择多个模式是可行的。

这是一个替代方案:

D <- adist(pattern, df$x, fixed = FALSE)
D
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    1    3
# [2,]    3    3    2    0
# [3,]    3    3    3    3
# [4,]    3    3    3    3
D[D > 0] <- NA
D
#      [,1] [,2] [,3] [,4]
# [1,]    0    0   NA   NA
# [2,]   NA   NA   NA    0
# [3,]   NA   NA   NA   NA
# [4,]   NA   NA   NA   NA
apply(D, 2, function(z) which.min(z)[1])
# [1]  1  1 NA  2
pattern[apply(D, 2, function(z) which.min(z)[1])]
# [1] "aaa" "aaa" NA    "bbb"
于 2021-03-19T18:32:26.397 回答