代码之家  ›  专栏  ›  技术社区  ›  Bastien

dplyr突变不适用于字段的单个元素

  •  0
  • Bastien  · 技术社区  · 6 年前

    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
    

    现在,我想把它用在 变异 调用添加一个字段,给出与表中每个中位数关联的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 打电话进来 变异 给出它应该做什么的想法。 日志 在这个世界上工作得很好 变异 因为它被称为元素的元素。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Maurits Evers    6 年前

    你需要允许 med2lambda 用向量代替标量。

    Vectorize :

    med2lambda.vectorised <- Vectorize(med2lambda)
    dd %>% mutate(lambda = med2lambda.vectorised(base_med), log = log(base_med))
    #  fire_zone base_med   lambda       log
    #1        ET        1 0.695426 0.0000000
    #2       EJB        1 0.695426 0.0000000
    #3       WJB        2 1.678581 0.6931472
    

    med2lambda2 <- function(med) sapply(med, function(x)
        polyroot(c(-0.02, 1/3 - x, 1)) %>% {suppressWarnings(as.numeric(.))} %>% max)
    dd %>% mutate(lambda = med2lambda2(base_med), log = log(base_med))
    #  fire_zone base_med   lambda       log
    #1        ET        1 0.695426 0.0000000
    #2       EJB        1 0.695426 0.0000000
    #3       WJB        2 1.678581 0.6931472
    
        2
  •  0
  •   akrun    6 年前

    我们可以用 map

    library(tidyverse)
    dd %>% 
        mutate(lambda = map_dbl(base_med, med2lambda), log = log(base_med))
    
    推荐文章