模式列表如下所示:
pattern <- c('aaa','bbb','ccc','ddd')来自df的x看起来像:
df$X <- c('aaa-053','aaa-001','aab','bbb')我尝试做的是:使用agrep在基于df$X的模式中找到匹配的名称,然后根据匹配结果为现有的列'column2‘赋值,例如,如果'aaa-053’匹配'aaa',则'aaa‘将是’column 2‘中的值,如果不匹配,则在该列中返回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'发布于 2021-03-20 02:32:26
当倍数匹配时,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"https://stackoverflow.com/questions/66713609
复制相似问题