首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,使用if循环和agrep来赋值

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

Stack Overflow用户
提问于 2021-03-20 02:13:01
回答 1查看 74关注 0票数 0

模式列表如下所示:

代码语言:javascript
复制
pattern <- c('aaa','bbb','ccc','ddd')

来自df的x看起来像:

代码语言:javascript
复制
df$X <- c('aaa-053','aaa-001','aab','bbb')

我尝试做的是:使用agrep在基于df$X的模式中找到匹配的名称,然后根据匹配结果为现有的列'column2‘赋值,例如,如果'aaa-053’匹配'aaa',则'aaa‘将是’column 2‘中的值,如果不匹配,则在该列中返回na。

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
'aaa','aaa',na,'bbb'
EN

回答 1

Stack Overflow用户

发布于 2021-03-20 02:32:26

当倍数匹配时,agrep本身不会给你太多的东西来决定使用哪一个。例如,

代码语言:javascript
复制
agrep(pattern[1], df$x)
# [1] 1 2 3

这对于前两个是有意义的,但第三个不在您的期望值之列。类似地,它可以为给定的字符串选择多个模式。

这里有一个替代方案:

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66713609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档