【问题标题】:dplyr, dunn test, Error in dim(robj) <- c(dX, dY) : dims [product 0] do not match the length of objectdplyr,dunn 测试,dim(robj) <- c(dX, dY) 中的错误:dims [product 0] 与对象的长度不匹配
【发布时间】:2019-02-26 05:14:00
【问题描述】:

我正在尝试将由变量值过滤的数据集传递给 R 中“asbio”包中的 pairw.kw 函数。

example.df <- data.frame( 
                 species = sample(c("primate", "non-primate"), 50, replace = TRUE),
                 treated = sample(c("Yes", "No"), 50, replace = TRUE), 
                 gender = sample(c("male", "female"), 50, replace = TRUE), 
                 var1 = rnorm(50, 100, 5)
               )

library(dplyr)
library(asbio)

with(example.df, pairw.kw(var1, species, conf=0.95))

此代码有效。不过,

example.df %>% 
   filter(treated=="No") %>% 
   {pairw.kw("var1", "species",conf = 0.95)}

给我错误信息

dim(robj)

我不明白是什么原因造成的,除了假设在应用过滤器后被比较的两个向量变成不同的长度。

除了将数据显式设置为新数据框并使用它之外,还有其他方法可以解决此问题吗?我知道这会起作用,但想知道是否存在更优雅的解决方案。

【问题讨论】:

    标签: r filter dplyr asbio


    【解决方案1】:

    首先%&gt;% 管道将data.frame 作为第一个参数传递给pairw.kw 函数。其次,pairw.kw 函数需要两个向量作为输入。您可以使用 magrittr 包中的 %$% 管道实现此目的。它的工作原理类似于with 函数。

    library(magrittr)
    
    example.df %>% 
       filter(treated=="No") %$% 
       pairw.kw(var1, species, conf = 0.95)
    

    在评论中回答问题:

    library(tidyverse)
    library(magrittr)
    library(asbio)
    
    example.df %>% 
      group_by(treated) %>%
      nest() %>%
      mutate(
        kw = map(
          data,
          ~ .x %$% pairw.kw(var1, species, conf = 0.95)
        ),
        p_val = map_dbl(kw, ~ .x$summary$`Adj. P-value`)
      )
    

    【讨论】:

    • 谢谢。那行得通。我确实遇到过 %$% 运算符,但没有意识到它会在数据框中公开变量。
    • 如果我使用组而不是过滤器进行此操作,则实际上不会发生分组。是否可以按(处理)分组并将每个小标题依次传递给pairw.kw进行分析?
    • 是的。请参阅我编辑的答案。现在您在kw 列中进行了比较,我制作了p_val 列来向您展示如何提取特定的统计信息。
    • 编辑:当我仔细检查数据框时,结果与by(example.df,example.df$treated, function(X) pairw.kw(X$var1, X$species, conf = 0.95)) 相同。最后一个请求:如果我有一个包含更多变量的数据框,我如何使用类似的代码遍历它们?使用说,example.df &lt;- data.frame( species = sample(c("primate", "non-primate"), 50, replace = TRUE), treated = sample(c("Yes", "No"), 50, replace = TRUE), gender = sample(c("male", "female"), 50, replace = TRUE), var1 = rnorm(50, 100, 5), resp=rnorm(50, 10,5), effect = rnorm (50, 25, 5))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多