如何解决使用dplyr在R DataFrame中使用用户定义的函数
可以在dplyr中使用用户定义的函数。但是,如果我使用以下代码:
create_string <- function(n) {
new_string <- paste(c(0:n),collapse=';')
return(new_string)
}
df <- data.frame(x = 1:3,number = c('4','2','1'),expected = c(create_string(4),create_string(2),create_string(1)))
df %>% mutate(reality = create_string(number))
输出等于:
x number expected reality
1 1 4 0;1;2;3;4 0;1;2;3;4
2 2 2 0;1;2 0;1;2;3;4
3 3 1 0;1 0;1;2;3;4
Warning messages:
1: Problem with `mutate()` input `reality`.
i numerical expression has 3 elements: only the first used
i Input `reality` is `create_string(number)`.
2: In 0:n : numerical expression has 3 elements: only the first used
因此您可以看到预期的输出与实际情况不符(包括错误)
解决方法
问题在于,mutate
一次填充了所有行,这意味着您实际上得到了create_string(4)
,而不是create_string(c(4,2,1))
。解决方案是以某种方式强制一次将执行值设为一个值。
df %>%
mutate(reality = sapply(number,create_string))
# x number expected reality
# 1 1 4 0;1;2;3;4 0;1;2;3;4
# 2 2 2 0;1;2 0;1;2
# 3 3 1 0;1 0;1
替代品:
df %>%
rowwise() %>%
mutate(reality = create_string(number)) %>%
ungroup()
df %>% mutate(reality = purrr::map_chr(number,create_string))
df %>% mutate(reality = Vectorize(create_string)(number))
或者您可以在内部对函数进行矢量化处理
create_string <- function(n) {
new_string <- sapply(n,function(n0) paste(c(0:n0),collapse=';'))
return(new_string)
}
df %>%
mutate(reality = create_string(number))
# x number expected reality
# 1 1 4 0;1;2;3;4 0;1;2;3;4
# 2 2 2 0;1;2 0;1;2
# 3 3 1 0;1 0;1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。