Как суммировать несколько столбцов по отдельности и создать точечный график

avatar
Kai Jiang
8 августа 2021 в 19:43
88
2
-2

Я пытаюсь создать точечную диаграмму, следуя нескольким переменным для моего проекта. Мне интересно, как я могу создать точечную диаграмму по сумме каждого дня в категории требований к маске. Пожалуйста, дайте мне знать все, что нужно предоставить.

Данные показаны ниже. Я также прикрепил к этому вопросу изображение того, что я ожидал.

State Day1 Day2 Day3 Day4 Mask 
CA    1    5     7    9   Yes
NY    10   8    20    90  No
VT    4   6    9    10    Yes

expected plot

Источник

Ответы (2)

avatar
Bernhard
8 августа 2021 в 20:11
1

Ответ в R и ggplot:

library(tidyr)
library(ggplot2)
obs <- read.table(header = TRUE,
                  text="State Day1 Day2 Day3 Day4 Mask 
CA    1    5     7    9   Yes
NY    10   8    20    90  No
VT    4   6    9    10    Yes")

print(obs)

# first pivot longer
obs_long <- pivot_longer(obs, cols = c("Day1", "Day2", "Day3", "Day4"))

# next aggregate by day and mask 
obs_agg <- aggregate(value ~ name + Mask, FUN = sum, data = obs_long)

# last: plot
ggplot(obs_agg) +
  geom_line(aes(x = name, y = value, color = Mask)) +
  geom_point(aes(x = name, y = value, color = Mask))

enter image description here

avatar
Martin Gal
8 августа 2021 в 20:10
0

Здесь можно использовать tidyverse-подход:

library(ggplot2)
library(tidyr)
library(dplyr)

df %>% 
  group_by(Mask) %>% 
  summarise(across(starts_with("Day"), sum)) %>% 
  pivot_longer(-Mask) %>% 
  ggplot(aes(x = name, y = value, color = Mask)) +
  geom_point() +
  xlab("Day") + 
  ylab("Value") +
  guides(color=guide_legend("Mask Requirement"))

Это возвращает

enter image description here

Так что же здесь произошло? Мы строим сумму за день и маскируем потребность, используя summarise. Это удаляет столбец state, так как он не нужен для окончательного графика. Затем мы приводим данные в длинный формат, используя tidyr::pivot_longer подготавливая данные для ggplot.

Данные

df <- structure(list(State = c("CA", "NY", "VT"), Day1 = c(1, 10, 4
), Day2 = c(5, 8, 6), Day3 = c(7, 20, 9), Day4 = c(9, 90, 10), 
    Mask = c("Yes", "No", "Yes")), problems = structure(list(
    row = 3L, col = "Mask", expected = "", actual = "embedded null", 
    file = "literal data"), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame")), class = c("spec_tbl_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -3L), spec = structure(list(
    cols = list(State = structure(list(), class = c("collector_character", 
    "collector")), Day1 = structure(list(), class = c("collector_double", 
    "collector")), Day2 = structure(list(), class = c("collector_double", 
    "collector")), Day3 = structure(list(), class = c("collector_double", 
    "collector")), Day4 = structure(list(), class = c("collector_double", 
    "collector")), Mask = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))