【问题标题】:How to print boxplots for each row of a dataset in R?如何为R中数据集的每一行打印箱线图?
【发布时间】:2018-08-26 15:25:39
【问题描述】:

这是一个示例数据,我想知道如果我想在 R 中分别为 Day1、Day2...Day6 绘制 stock1、stock2、stock 3 和 stock 4 的箱线图应该怎么做?

head(StockExample)
    X1 Stock1 Stock2 Stock3 Stock4
1 Day1 185.74   1.47   1605  95.05
2 Day2 184.26   1.56   1580  97.49
3 Day3 162.21   1.39   1490  88.57
4 Day4 159.04   1.43   1520  85.55
5 Day5 164.87   1.42   1550  92.04
6 Day6 162.72   1.36   1525  91.70

所以每天有 6 个箱线图,每个箱线图中有 1-4 个库存。希望我说得通。另外,我可以使用 apply 函数来做到这一点吗?

我尝试为此寻找答案,但无法正确回答。感谢这方面的任何帮助。非常感谢!

【问题讨论】:

    标签: r plot boxplot


    【解决方案1】:

    一个好的做法是“收集”库存列。像下面这样的东西应该可以工作。 (但我没有测试过。)

    require(tidyverse)
    require(stringr)
    
    StockExample %>% 
        tidyr::gather(key = "Stock", value = "value", -X1) %>% 
        dplyr::mutate(day = stringr::str_replace(X1, "Day", "") %>% as.numeric() ) %>% 
        dplyr::mutate(Stock = stringr::str_replace(Stock, "Stock", "") %>% as.numeric() ) %>%
        ggplot(aes(x = day, y = value)) +
        geom_boxplot()
    

    (上面的代码使用作用域,packagename::functionname,来指示 tidyverse 中用于执行某些操作的特定函数。

    【讨论】:

    • 您的解决方案有效,但您应在 aes 中添加 colour = X1。以下是数据:structure(list(X1 = structure(1:6, .Label = c("Day1", "Day2", "Day3", "Day4", "Day5", "Day6"), class = "factor"), Stock1 = c(185.74, 184.26, 162.21, 159.04, 164.87, 162.72), Stock2 = c(1.47, 1.56, 1.39, 1.43, 1.42, 1.36), Stock3 = c(1605L, 1580L, 1490L, 1520L, 1550L, 1525L), Stock4 = c(95.05, 97.49, 88.57, 85.55, 92.04, 91.7)), class = "data.frame", row.names = c(NA, -6L)) 正要给出答案,但你的速度更快。
    【解决方案2】:

    有几种方法可以做到这一点,以上两种方法都要求数据为长格式。
    为了重新格式化数据,我将使用包 reshape2 中的函数 melt

    long <- reshape2::melt(StockExample, id.var = "X1")
    

    现在是图表。

    首先,使用基础 R 图形。

    boxplot(value ~ X1, long)
    

    其次,使用包ggplot2

    library(ggplot2)
    
    ggplot(long, aes(X1, value)) +
        geom_boxplot()
    

    数据。

    StockExample <-
    structure(list(X1 = structure(1:6, .Label = c("Day1", "Day2", 
    "Day3", "Day4", "Day5", "Day6"), class = "factor"), Stock1 = c(185.74, 
    184.26, 162.21, 159.04, 164.87, 162.72), Stock2 = c(1.47, 1.56, 
    1.39, 1.43, 1.42, 1.36), Stock3 = c(1605L, 1580L, 1490L, 1520L, 
    1550L, 1525L), Stock4 = c(95.05, 97.49, 88.57, 85.55, 92.04, 
    91.7)), class = "data.frame", row.names = c("1", "2", "3", "4", 
    "5", "6"))
    

    【讨论】:

      【解决方案3】:

      你可以得到长格式的数据,然后用ggstatsplot就很简单了:

      # needed libraris
      library(tidyverse)
      library(ggstatsplot)
      
      # provided data sample
      df <- read.table(
        text = "Row Day Stock1 Stock2 Stock3 Stock4
        1 Day1 185.74   1.47   1605  95.05
        2 Day2 184.26   1.56   1580  97.49
        3 Day3 162.21   1.39   1490  88.57
        4 Day4 159.04   1.43   1520  85.55
        5 Day5 164.87   1.42   1550  92.04
        6 Day6 162.72   1.36   1525  91.70",
        header = TRUE
      ) %>%
        tibble::as_data_frame()
      
      # converting to long format
      (
        df_long <- df %>%
          tidyr::gather(
            data = .,
            key = "stock type",
            value = "stock value",
            Stock1:Stock4
          )
      )
      #> # A tibble: 24 x 4
      #>      Row Day   `stock type` `stock value`
      #>    <int> <fct> <chr>                <dbl>
      #>  1     1 Day1  Stock1              186.  
      #>  2     2 Day2  Stock1              184.  
      #>  3     3 Day3  Stock1              162.  
      #>  4     4 Day4  Stock1              159.  
      #>  5     5 Day5  Stock1              165.  
      #>  6     6 Day6  Stock1              163.  
      #>  7     1 Day1  Stock2                1.47
      #>  8     2 Day2  Stock2                1.56
      #>  9     3 Day3  Stock2                1.39
      #> 10     4 Day4  Stock2                1.43
      #> # ... with 14 more rows
      
      # plot
      ggstatsplot::ggbetweenstats(
        data = df_long,
        x = Day,
        y = `stock value`,
        plot.type = "box"
      )
      

      reprex package (v0.2.0.9000) 于 2018 年 8 月 26 日创建。

      【讨论】:

        【解决方案4】:

        最简单的解决方案可能是按行拆分data.frame

        byDay <- split(StockExample[,-1], StockExample$X1)
        

        然后将所有这些转换为数字格式:

        byDay <- lapply(byDay, as.numeric)
        

        然后只需调用boxplot就可以了:

        boxplot(byDay)
        

        或者将所有内容放在一行中:

        boxplot(lapply(split(StockExample[,-1], StockExample$X1), as.numeric))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多