繁体   English   中英

如何在R中为数据集的每一行打印箱形图?

[英]How to print boxplots for each row of a dataset in R?

这是一个示例数据,我想知道如果要在R中分别对Day1,Day2 ... Day6进行箱装stock1,stock2,stock 3和stock4的绘图,该怎么办?

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函数执行此操作吗?

我试图为此寻找答案,但是找不到正确的答案。 感谢这方面的帮助。 非常感谢!

开发一个好的做法是“收集”库存列。 像下面这样的东西应该起作用。 (但我尚未对此进行测试。)

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中用于执行某些操作的特定功能。

有几种方法可以做到这一点,以上两种都要求数据采用长格式。
为了重新格式化数据,我将使用来自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"))

您可以获取长格式的数据,然后使用ggstatsplot直接进行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软件包 (v0.2.0.9000)创建于2018-08-26。

最简单的解决方案可能是按行分割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))

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM