【问题标题】:mutate on nested tibble在嵌套的 tibble 上变异
【发布时间】:2019-05-31 02:16:50
【问题描述】:

我有一个嵌套的tibble,格式如下:

library(purrr)
library(dplyr)

ex <- tibble(data = list(val = rnorm(12), 
                         val = rnorm(5), 
                         val = rep(NA, 5), 
                         val = c(rnorm(3), NA)), 
               p1 = rnorm(4),
               p2 = rnorm(4)) %>% 
         mutate(data = map(data, tibble))

我想要一个新的列,其中填充了 p-值,该值是从 data 中的每个 tibble 计算的 tibble 与存储在 p1 中的参数的正态分布相比p2.

我尝试了类似的东西

ex %>%
   mutate(ks_test = map(data, 
             ~tryCatch( #to avoid problems with tibbles filled only by NAs
                ks.test(x = .$val,
                        y = "pnorm",
                        mean = .$p1,
                        sd = .$p2), 
              error = function(e) list(p.value = NA))),
           ks_pvalue = map_dbl(ks_test, "p.value"))

不幸的是,它未能执行测试,仅提供 NA。

拜托,你能帮我修复这段代码吗? 谢谢。

【问题讨论】:

    标签: r purrr dplyr tibble


    【解决方案1】:

    我会将您转介至purrr::possibly 来处理您的 NA 案件。就处理完整的向量而言,有一个分组列可以嵌套。 ks_test 的特定功能也有助于保持清洁。

    library(purrr)
    library(dplyr)
    #> 
    #> Attaching package: 'dplyr'
    #> The following objects are masked from 'package:stats':
    #> 
    #>     filter, lag
    #> The following objects are masked from 'package:base':
    #> 
    #>     intersect, setdiff, setequal, union
    library(tidyverse)
    
    
    val1 = data.frame(val = rnorm(12), group = 1)
    val2 = data.frame(val = rnorm(5), group = 2)
    
    ks_test_fun <- function(data, p1, p2, ...){
      data %>% 
      ks.test(x = .$val, y = "pnorm", mean = p1, sd = p2) %>% 
      broom::tidy() %>% 
      pull(p.value)
    }
    
    set.seed(4)
    rbind(val1, val2) %>% 
      group_by(group) %>% 
      nest() %>% 
      mutate(p1 = rnorm(2), p2 = rnorm(2)) %>% 
      mutate(ks_test_pval = map(data, ks_test_fun, p1, p2)) %>% 
      unnest(ks_test_pval)
    #> # A tibble: 2 x 5
    #>   group data                  p1    p2 ks_test_pval
    #>   <dbl> <list>             <dbl> <dbl>        <dbl>
    #> 1     1 <tibble [12 x 1]>  0.217 0.891        0.137
    #> 2     2 <tibble [5 x 1]>  -0.542 0.596        0.333
    

    reprex package (v0.2.1) 于 2019-01-04 创建

    【讨论】:

    • 你也可以避免在最后一行使用unnest(),在上一行使用map_dbl,而不是map
    • 感谢您对possibly 的回答和建议,并使用特定功能提高代码可读性。但是,理想的答案应该应用于问题中提供的对象ex,并且它应该能够处理“all-NAs”小标题。谢谢。
    • @Ndr 我想知道“all-NAs”是否更多是数据清理的问题。对我来说,如果列仅 NA,则 ks.test 似乎失败,但是您必须在 p1 和 p2 上具有与非仅 NA 小标题相同的行数。在推送到 ks.test 之前,我会过滤掉仅 NA 的行,但也许这不是你的选择。
    • 过滤掉仅 NA 行的选项是不可行的,因为我必须保留原始数据集中的所有行。也许,一种选择是使用类似ifelse 的语句,其中仅NA 行(sum(!is.na(x)) == 0)将给出ks_test_pval &lt;- NA,而带有sum(!is.na(x)) != 0 的行将提交给ks_test_fun,但是我需要一些帮助来实现它。
    猜你喜欢
    • 2019-11-03
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2022-07-07
    • 2019-08-07
    • 2019-07-15
    • 2022-01-11
    相关资源
    最近更新 更多