Здесь можно использовать 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"))
Это возвращает

Так что же здесь произошло? Мы строим сумму за день и маскируем потребность, используя 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"))