如何解决在 R 中,使用 if 循环和 agrep 来赋值
模式列表如下所示:
pattern <- c('aaa','bbb','ccc','ddd')
X 来自 df 看起来像:
df$X <- c('aaa-053','aaa-001','aab','bbb')
我尝试做的:使用 agrep 在基于 df$X 的模式中查找匹配的名称,然后根据匹配结果将值分配给现有的列 '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'
解决方法
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
# [,] 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,function(z) which.min(z)[1])]
# [1] "aaa" "aaa" NA "bbb"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。