R 函数在mutate中表现不同
我有一个函数在通过dplyr包中的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
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_)
}