Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用rappy从名称的字符向量到后缀的字符向量_R_Apply - Fatal编程技术网

使用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作为您的答案。