使用rappy从名称的字符向量到后缀的字符向量
我想从一组全名中删除一组后缀(后缀和全名都是字符向量)。使用两个使用rappy从名称的字符向量到后缀的字符向量,r,apply,R,Apply,我想从一组全名中删除一组后缀(后缀和全名都是字符向量)。使用两个for()循环和gsub(),这非常容易,但似乎应该有一种更有效的方法(在代码行和时钟周期中) 我的第一个想法是rappy(),但我无法让它工作。也许for()循环是最好的方法,但在这一点上,我感兴趣的是更好地理解rappy() 这是()的for循环版本 names.full <- c("tom inc", "dick co", "harry incorp", "larry inc incorp", "curly", "moe
for()
循环和gsub()
,这非常容易,但似乎应该有一种更有效的方法(在代码行和时钟周期中)
我的第一个想法是rappy()
,但我无法让它工作。也许for()
循环是最好的方法,但在这一点上,我感兴趣的是更好地理解rappy()
这是()的for
循环版本
names.full <- c("tom inc", "dick co", "harry incorp", "larry inc incorp", "curly", "moe")
suffix <- c("inc", "incorp", "incorporated", "co", "company")
suffix <- paste(" ", suffix, "$", sep = "")
# with loops
names.abbr <- names.full
for (k in seq(2)) {
for (i in seq(length(names.abbr))) {
for (j in seq(length(suffix))) {
names.abbr[i] <- gsub(suffix[j], "", names.abbr[i])
}
}
}
这会产生以下错误:
> names.abbr.fail <- unlist(rapply(as.list(suffix), inner.fun, x = names.full, how = replace))
Error in match.arg(how) : 'arg' must be NULL or a character vector
>names.abbr.fail您真的需要使用for循环吗?我认为您应该能够使用gsub中的反向引用来提取您想要的内容
\\w
匹配0-9、A-Z和A-Z范围内的任何字符李>
+
与上一个字符匹配1次或多次
()
允许我们在后面的代码中反向引用任何内容
正则表达式
匹配任何字符和所有字符,*
匹配
前面的字符0次或多次
将上述所有因素综合起来,我们可以:
gsub("(\\w+)(.*)", "\\1", names.full)
> gsub("(\\w+)(.*)", "\\1", names.full)
[1] "tom" "dick" "harry" "larry" "curly" "moe"
您真的需要使用for循环吗?我认为您应该能够使用gsub中的反向引用来提取您想要的内容
\\w
匹配0-9、A-Z和A-Z范围内的任何字符李>
+
与上一个字符匹配1次或多次
()
允许我们在后面的代码中反向引用任何内容
正则表达式
匹配任何字符和所有字符,*
匹配
前面的字符0次或多次
将上述所有因素综合起来,我们可以:
gsub("(\\w+)(.*)", "\\1", names.full)
> gsub("(\\w+)(.*)", "\\1", names.full)
[1] "tom" "dick" "harry" "larry" "curly" "moe"
在您的示例中,除了第一个单词外,您只删除了所有单词。这很容易做到
sub(" .*$", "", names.full)
但更一般的regexpr模式类似于“(后缀x1 |后缀x2)
,它包含所有后缀
由于您似乎希望从一个字符串中删除多个后缀,如“larry incorp”
,因此您需要类似“(后缀x1 |后缀x2)+$”
的内容
然后,您只需将其应用于name.full
(我将“moe”改为“moe money”,以显示“第一个单词”解决方案失败的地方)。它看起来像这样:
names.full <- c("tom inc", "dick co", "harry incorp",
"larry inc incorp", "curly", "moe money")
suffix <- c("inc", "incorp", "incorporated", "co", "company")
pattern <- paste("(", paste(" ", suffix, collapse="|", sep=""), ")+$", sep="")
sub(pattern, "", names.full)
[1] "tom" "dick" "harry" "larry" "curly" "moe money"
names.full在您的示例中,除了第一个单词之外,您只能删除所有单词。这很容易做到
sub(" .*$", "", names.full)
但更一般的regexpr模式类似于“(后缀x1 |后缀x2)
,它包含所有后缀
由于您似乎希望从一个字符串中删除多个后缀,如“larry incorp”
,因此您需要类似“(后缀x1 |后缀x2)+$”
的内容
然后,您只需将其应用于name.full
(我将“moe”改为“moe money”,以显示“第一个单词”解决方案失败的地方)。它看起来像这样:
names.full <- c("tom inc", "dick co", "harry incorp",
"larry inc incorp", "curly", "moe money")
suffix <- c("inc", "incorp", "incorporated", "co", "company")
pattern <- paste("(", paste(" ", suffix, collapse="|", sep=""), ")+$", sep="")
sub(pattern, "", names.full)
[1] "tom" "dick" "harry" "larry" "curly" "moe money"
names.full我想错误是因为您没有在inner.fun中引用“replace”。我不知道如何使用rappy
,但我确信有一种比for循环更好的方法……我认为错误是因为您没有在inner.fun中引用“replace”。我不知道如何使用rappy
实现这一点,但我确信有一种比for循环更好的方法……这适用于给定的示例名称,但只保留第一个单词。对于像'moe money inc'
@Tommy-fair point这样的字符串,它是不起作用的,尽管从阅读OP原始问题和示例来看,这似乎是他想要的。健壮的解决方案应该附带健壮的示例:)+1作为您的答案。这适用于给定的示例名称,但只保留第一个单词。对于像'moe money inc'
@Tommy-fair point这样的字符串,它是不起作用的,尽管从阅读OP原始问题和示例来看,这似乎是他想要的。稳健的解决方案应该附带稳健的示例:)+1作为您的答案。