微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 R 中,使用 if 循环和 agrep 来赋值

如何解决在 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 举报,一经查实,本站将立刻删除。