Вот три решения.В будущем это поможет показать, что вы пробовали, чтобы мы могли адаптировать ответ к вашим методам и / или предпочтениям.
Во-первых, ваши данные не отформатированы должным образом: использование пробелов в именах столбцов не рекомендуется вR, поэтому в этом примере я вместо этого буду использовать
x <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
ID Vaccine Day Temperature Weight
558 None -2 100.6 1420
558 None -1 101.5 1420
558 None 20 102 1450
547 Vaccine 31 101.5 1080
547 Vaccine 32 100.8 1100
548 Vaccine -2 100.7 1290
548 Vaccine -1 101.2 1300
548 Vaccine 0 101.6 1320
548 Vaccine 1 101.5 1031
548 Vaccine 2 101.9 1310
548 Vaccine 3 101.6 1300
548 Vaccine 7 101.7 1300
548 Vaccine 14 102.2 1280")
Во-вторых, я буду считать, что все ваши значения Day
являются целыми;в противном случае возникнут проблемы с группировкой, поскольку не будет очевидно (учитывая то, что мы знаем), что что-либо, кроме целочисленных дней, будет иметь смысл.
Хорошо, вот поспешный способ Base-R сделать вещи:
x1 <- x[ x$Vaccine == "None", ]
x2 <- do.call(
rbind.data.frame,
by(x1, x1$Day, function(a) data.frame(Day = a$Day[1], AvgTemp = mean(a$Temperature, na.rm=TRUE)))
)
x2
# Day AvgTemp
# -2 -2 100.6
# -1 -1 101.5
# 20 20 102.0
plot(AvgTemp ~ Day, data = x2, type = "b", pch = 16)

Кроме того, если вам удобнее использовать решения на основе dplyr
или data.table
:
library(dplyr)
x %>%
filter(Vaccine == "None") %>%
group_by(Day) %>%
summarize(AvgTemp = mean(Temperature, na.rm = TRUE)) %>%
plot(AvgTemp ~ Day, data = ., type = "b", pch = 16)
library(data.table)
DT <- as.data.table(x)
DT1 <- DT[ Vaccine == "None", .(AvgTemp = mean(Temperature, na.rm = TRUE)), by = "Day" ]
plot(AvgTemp ~ Day, data = DT1, type = "b", pch = 16)