【发布时间】:2018-08-16 16:34:09
【问题描述】:
我有一个函数在通过 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)
}
}
有效:
x <- "B30 1AA" # plucked randomly from a postcode site
> pArea_parse(x)
[1] "B"
这是一些示例数据:
test <- data.frame(id = c(1,2,3,4), post_code = c("B30 1AA", "B30 3FT", "B30
3AZ", "BA1 8TU"))
这是我的 dplyr 代码:
test %>% mutate(postal_area = pArea_parse(post_code))
当有一个字母后跟一个数字时,它不会返回第一个字母,而是返回字母和数字,即使邮政编码向量或单个邮政编码不会发生这种情况。
id post_code postal_area
1 B30 1AA B3
2 B30 3FT B3
3 B30 3AZ B3
4 BA1 8TU BA
当与 mutate 结合使用时,函数如何做一些它没有被编程做的事情?我被难住了!
【问题讨论】:
-
我认为问题在于你的函数不能与向量一起正常工作。
-
我认为您可能想围绕 ifelse 构建它,或者甚至更好的 case_when 而不是传统的 if/else 子句。前者是矢量化的。
-
如何正确向量化函数?为什么向量化我的函数不会产生观察到的行为?谢谢。
-
如果你在函数中使用
purrr::map和tidyr::unnest,你可以避免向量化。test %>% mutate(postal_area = map(post_code, pArea_parse)) %>% unnest()