我正在尝试在mutate
调用中使用自制函数进行计算,但未达到我期望的那样。
以下是可重现的示例:
library(dplyr)
#the data
dd <- structure(list(fire_zone = c("ET", "EJB", "WJB"), base_med = c(1, 1, 2)), class = "data.frame", row.names = c(NA, -3L))
# my home made function
med2lambda <- function(med) polyroot(c(-0.02, 1/3 - med, 1)) %>% {suppressWarnings(as.numeric(.))} %>% max
所以,我的功能是通过计算二次函数的根来从泊松分布中估计与中位数相关的λ。尽管有很长的解释,但实际上它是非常基本的:
med2lambda(1)
[1] 0.695426
med2lambda(2)
[1] 1.678581
现在,我想在mutate
调用中使用它来添加一个字段,该字段给出与表中每个中位数关联的lambda:
dd %>% mutate(lambda = med2lambda(base_med), log = log(base_med))
fire_zone base_med lambda log
1 ET 1 2.128966 0.0000000
2 EJB 1 2.128966 0.0000000
3 WJB 2 2.128966 0.6931472
结果是错误的,mutate实际上给了我以下结果:
med2lambda(dd$base_med)
[1] 2.128966
我在log
中添加了mutate
调用,以了解其应采取的措施。 log
在mutate
中的效果非常好,因为它被称为逐元素。
任何对此行为的见解将不胜感激。
答案 0 :(得分:0)
我们可以使用map
library(tidyverse)
dd %>%
mutate(lambda = map_dbl(base_med, med2lambda), log = log(base_med))