R 函数在mutate中表现不同

R 函数在mutate中表现不同,r,dplyr,mutate,R,Dplyr,Mutate,我有一个函数在通过dplyr包中的mutate函数时行为不正确。该函数采用英国邮政编码并返回邮政区域。它适用于单个邮政编码或邮政编码向量 以下是函数: pArea_parse <- function(x) { z <- any(grep('[A-Z][A-Z]',substr(x,1,2))) y <- any(grep('[A-Z][0-9]',substr(x,1,2))) if (z) { return(substr(x,1,2)) } else if

我有一个函数在通过dplyr包中的mutate函数时行为不正确。该函数采用英国邮政编码并返回邮政区域。它适用于单个邮政编码或邮政编码向量

以下是函数:

pArea_parse <- function(x) {
z <- any(grep('[A-Z][A-Z]',substr(x,1,2)))
y <- any(grep('[A-Z][0-9]',substr(x,1,2)))

if (z) {
    return(substr(x,1,2))
    }
else if (y) {
        return(substr(x,1,1))
        }
else if (!y & !z) {
    return(NA)
        }
}
当字母后跟数字时,它不会返回第一个字母,而是返回字母和数字,即使这不会发生在邮政编码向量或单个邮政编码中

id post_code postal_area
1   B30 1AA          B3
2   B30 3FT          B3
3   B30 3AZ          B3
4   BA1 8TU          BA
当一个函数与mutate一起使用时,它怎么能做一些没有编程的事情呢?我被难住了

使用
any()
if/else
使函数非矢量化。也就是说,如果传入一个值向量,就不会得到正确的值向量。 这不是特定于
mutate()
。如果你在mutate之外尝试你的函数,你会得到同样的结果

pArea_parse(c("B30 1AA", "B30 3FT", "B30 3AZ", "BA1 8TU"))
# [1] "B3" "B3" "B3" "BA"
您可以在时使用
dplyr
助手功能
case\u简化此操作。比如说

pArea_parse <- function(x) {
  z <- grepl('[A-Z][A-Z]',substr(x,1,2))
  y <- grepl('[A-Z][0-9]',substr(x,1,2))

  case_when(z~substr(x,1,2),
            y~substr(x,1,1),
            TRUE~NA_character_)
}
pArea\u parse您使用的
any()
if/else
使您的函数非矢量化。也就是说,如果传入一个值向量,就不会得到正确的值向量。 这不是特定于
mutate()
。如果你在mutate之外尝试你的函数,你会得到同样的结果

pArea_parse(c("B30 1AA", "B30 3FT", "B30 3AZ", "BA1 8TU"))
# [1] "B3" "B3" "B3" "BA"
您可以在
时使用
dplyr
助手功能
case\u简化此操作。比如说

pArea_parse <- function(x) {
  z <- grepl('[A-Z][A-Z]',substr(x,1,2))
  y <- grepl('[A-Z][0-9]',substr(x,1,2))

  case_when(z~substr(x,1,2),
            y~substr(x,1,1),
            TRUE~NA_character_)
}

pArea\u parse我认为问题在于你的函数不能正确处理向量。我认为你可能想围绕ifelse,或者更好的case\u when来构造它,而不是传统的if/else子句。前者是矢量化的。如何正确地矢量化函数?为什么向量化我的函数不会产生观察到的Behvaior?谢谢。如果在函数中使用
purrr::map
tidyr::unnest
,则可以避免矢量化
test%>%mutate(postal\u area=map(post\u code,pArea\u parse))%>%unest()
我认为问题在于您的函数不能正确处理向量。我认为您可能希望围绕ifelse来构造它,或者甚至更好的case\u when,而不是传统的if/else子句。前者是矢量化的。如何正确地矢量化函数?为什么向量化我的函数不会产生观察到的Behvaior?谢谢。如果在函数中使用
purrr::map
tidyr::unnest
,则可以避免矢量化<代码>测试%>%mutate(postal\u area=map(post\u code,pArea\u parse))%%>%unest()
谢谢,这很有效。你知道我在哪里可以学到矢量化函数吗?我真的不明白为什么我的函数不起作用,而你的函数却起作用了……这是我在谷歌搜索它时想到的第一件事:。还有很多其他人也在那里。尝试搜索“r矢量化函数”类似的答案,但在基本r:
pArea_parse谢谢,这很有效。你知道我在哪里可以学到矢量化函数吗?我真的不明白为什么我的函数不起作用,而你的函数却起作用了……这是我在谷歌搜索它时想到的第一件事:。还有很多其他人也在那里。尝试搜索“r矢量化函数”类似的答案,但在基本r:
pArea\u parse中
pArea_parse <- function(x) {
  z <- grepl('[A-Z][A-Z]',substr(x,1,2))
  y <- grepl('[A-Z][0-9]',substr(x,1,2))

  case_when(z~substr(x,1,2),
            y~substr(x,1,1),
            TRUE~NA_character_)
}