dplyr变异不适用于单个字段

时间:2018-09-14 16:46:41

标签: r dplyr

我正在尝试在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调用,以了解其应采取的措施。 logmutate中的效果非常好,因为它被称为逐元素。

任何对此行为的见解将不胜感激。

1 个答案:

答案 0 :(得分:0)

我们可以使用map

library(tidyverse)
dd %>% 
    mutate(lambda = map_dbl(base_med, med2lambda), log = log(base_med))