首页 > 解决方案 > 如何结合 2 个 lapply() 函数来创建箱线图?

问题描述

所以我有这段代码并尝试创建一个箱线图并添加 p 值以显示显着不同的组。首先是我使用lapply()函数创建了一个箱线图,它给了我来自 dataframe 1.3.A2.2.A和的 3 个箱线图1.1.B。我还使用and分析了HeightandAge列。我能够从邓恩的测试中获取并将其保存到另一个变量中(我将其保存在变量中,该变量是一个包含多个 pvalue 数据帧的列表)。我想要做的是使用. 但是,由于是列表,我不知道如何将 pvalues 合并到返回错误的箱线图中:kruskal.test()dunnTest()P.adjpoopoowalesstat_pvlaue_manual()poo

  can't find the y.position variable 'y.position' in the data
Called from: .valide_y_position(y.position, data)

我正在做的事情甚至可能吗?对不起,我是 R 的新手。我只是在追求重要的价值并将其放在我创建的箱线图中。我使用的是stat_pvalue_manual()因为 pvalues 来自 dunnTest 所以。我尝试使用stat_compare_means()但无法使其正常工作。让这更难的是一切都在里面lapply,我不知道如何正确地将这些整合在一起。

wales <- lapply(df_list, function(p) ggboxplot(p, x = "Person", y = c("Height", "Age"), 
                                                     combine = TRUE, 
                                                     x.text.angle = 360, 
                                                     orientation = "horizontal", 
                                                     ylab = "Measurement (cm)",
                                                     ggtheme = theme_gray()) + 
                                                     font("xy.text", size = 7, color = "black") + 
                                                     theme(legend.position = "None", 
                                                     axis.text.x =element_text(color = "black")) + 
                                                     lapply(poo,  function(g) stat_pvalue_manual(label = "P.adj", 
                                                     y.position = 7), data = g))

这是我的示例数据:

df_list <- list(
  `1.3.A` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,  ~Age, 
      "Alex",    175L,     75L,    15,
      "Gerard",    180L,     85L,  17,
      "Clyde",    179L,     79L,   19,
      "Alex",    175L,     75L,    22,
      "Gerard",    180L,     85L,  21,
      "Clyde",    179L,     79L,    20

    ),
  `2.2.A` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,   ~Age,
      "Alex",    175L,     75L,     18,
      "Gerard",    180L,     85L,   18,
      "Clyde",    179L,     79L,    19,
       "Alex",    175L,     75L,    25,
      "Gerard",    180L,     85L,   27,
      "Clyde",    179L,     79L,    26
    ), 
  `1.1.B` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,    ~Age,
      "Alex",    175L,     75L,       22,
      "Gerard",    180L,     85L,     23,
      "Clyde",    179L,     79L,      25, 
      "Alex",    175L,     75L,       27,
      "Gerard",    180L,     85L,     18,
      "Clyde",    179L,     79L,      19   
    )
)

标签: rggplot2graphlapply

解决方案


我并不完全熟悉,ggboxplot()或者stat_pvalue_manual()您可以做的是使用一个循环和一个 y 结果来获取每个图上的 p 值。poo只是一个 p 值列表,在wales我使用一个循环,其值为 1 到 3 作为列表,然后根据位置对两个列表进行子集df_listpoo

 poo <- list(dat1 = data.frame(group1 = 0.01, group2 = NA),
             dat2 =data.frame(group1 =.09, group2 = NA)
             ,dat3 = data.frame(group1 = .9, group2 = NA))
 
 wales <- lapply(1:length(df_list), function(p) ggboxplot(df_list[[p]], x = "Person", y = c("Height"), 
                                                combine = TRUE, 
                                                x.text.angle = 360, 
                                                orientation = "horizontal", 
                                                ylab = "Measurement (cm)",
                                                ggtheme = theme_gray()) + 
                   font("xy.text", size = 7, color = "black") + 
                   theme(legend.position = "None", 
                         axis.text.x =element_text(color = "black"))+
                stat_pvalue_manual(label = "group1", y.position = 7, data = poo[[p]]))

推荐阅读