gpt4 book ai didi

r - dplyr::mutate 添加多个值

转载 作者:行者123 更新时间:2023-12-03 09:23:30 25 4
gpt4 key购买 nike

dplyr Github repo 上有几个关于此的问题已经,并且至少有一个相关的 SO 问题,但没有一个能完全涵盖我的问题——我认为。

  • Adding multiple columns in a dplyr mutate call或多或少是我想要的,但是对于这种情况( tidyr::separate )有一个特殊情况的答案(我认为)对我不起作用。
  • This issue ("summarise or mutate with functions return multiple values/columns") 说“使用 do()”。

  • 这是我的用例:我想计算精确的二项式置信区间
    dd <- data.frame(x=c(3,4),n=c(10,11))
    get_binCI <- function(x,n) {
    rbind(setNames(c(binom.test(x,n)$conf.int),c("lwr","upr")))
    }
    with(dd[1,],get_binCI(x,n))
    ## lwr upr
    ## [1,] 0.06673951 0.6524529

    我可以通过 do() 完成此操作但我想知道是否有更富有表现力的方式来做到这一点(感觉就像 mutate() 可能有 .n 参数 as is being discussed for summarise() ...)
    library("dplyr")
    dd %>% group_by(x,n) %>%
    do(cbind(.,get_binCI(.$x,.$n)))

    ## Source: local data frame [2 x 4]
    ## Groups: x, n
    ##
    ## x n lwr upr
    ## 1 3 10 0.06673951 0.6524529
    ## 2 4 11 0.10926344 0.6920953

    最佳答案

    老问题(有很多好的答案),但这是 tidyverse 的 broom package 的一个很好的用例,它处理来自测试和建模对象的整理输出(例如 binom.testlm 等)。

    它比其他方法更冗长,但我认为它符合您对更具表现力的方法的渴望。

    过程是:

  • 定义您将运行的组binom.test on(在这种情况下,这些组由 xn 定义)和 nest它们,为每个创建单独的 data.frames(在完整的 data.frame 内)
  • map binom.test调用xn每组的值
  • tidy binom.test每组的输出(这是扫帚进来的地方)
  • unnest整理后的测试输出 data.frames 到完整的 data.frame

  • 现在你剩下一个data.frame,其中每一行都包含 xn值,结合相应 binom.test 的所有输出,为每一位输出信息(点估计、上/下 conf、p 值等)整齐地格式化为单独的列。

    library(tidyverse)
    library(broom)
    dd <- data.frame(x=c(3,4),n=c(10,11))
    dd %>%
    group_by(x, n) %>%
    nest() %>%
    mutate(test = map(data, ~tidy(binom.test(x, n)))) %>%
    unnest(test)
    #> # A tibble: 2 x 11
    #> # Groups: x, n [2]
    #> x n data estimate statistic p.value parameter conf.low conf.high
    #> <dbl> <dbl> <lis> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #> 1 3 10 <tib… 0.3 3 0.344 10 0.0667 0.652
    #> 2 4 11 <tib… 0.364 4 0.549 11 0.109 0.692
    #> # … with 2 more variables: method <chr>, alternative <chr>

    从这里您可以通过更多操作、选择所需的输出变量并重命名它们来获得您想要的确切格式:

    dd %>%
    group_by(x, n) %>%
    nest() %>%
    mutate(test = map(data, ~tidy(binom.test(x, n)))) %>%
    unnest(test) %>%
    rename(lwr = conf.low, upr = conf.high) %>%
    select(x, n, lwr, upr)
    #> # A tibble: 2 x 4
    #> # Groups: x, n [2]
    #> x n lwr upr
    #> <dbl> <dbl> <dbl> <dbl>
    #> 1 3 10 0.0667 0.652
    #> 2 4 11 0.109 0.692

    如前所述,它很冗长。比(例如)@joran 的简洁优美

    dd %>% 
    group_by(x,n) %>%
    do(foo(.$x,.$n))

    但是,扫帚方法的好处是您不需要定义函数 foo (或 get_binCI )。它是完全独立的,在我看来更具表现力和灵 active 。

    关于r - dplyr::mutate 添加多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614849/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com