Как распечатать коробочные диаграммы для каждого ряда набора данных в R? - PullRequest
0 голосов
/ 26 августа 2018

Вот пример данных, и мне было интересно, что мне делать, если я хочу выставить на карту складские запасы 1, 2, 2 и 3, для Дня 1, Дня 2 ... Дня 6 отдельно, в R?

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?

Я попытался найти ответ на этот вопрос, но не смог сделать это правильно.Ценю любую помощь в этом отношении.Большое спасибо!

Ответы [ 4 ]

0 голосов
/ 26 августа 2018

Самым простым решением, вероятно, является разбиение 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))

enter image description here

0 голосов
/ 26 августа 2018

Есть несколько способов сделать это, оба из вышеперечисленных требуют, чтобы данные были в длинном формате.
Для переформатирования данных я буду использовать функцию melt из пакета reshape2.

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"))
0 голосов
/ 26 августа 2018

Вы можете получить данные в длинном формате, а затем просто с помощью 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"
)

Создано в 2018-08-26 с помощью Представить пакет (v0.2.0.9000).

0 голосов
/ 26 августа 2018

Хорошей практикой для развития было бы собирать столбцы акций. Что-то вроде следующего должно работать. (Но я не проверял это.)

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, для указания конкретных функций в пределах тививерса, используемого для выполнения некоторых операций.

...