Just to add how to get from your table as it is to what's been mentioned here.
df %<>% pivot_longer(names_to = "Protein", values_to = "ProtVal", cols = c(matches("Protein\\.")))
df %<>% pivot_wider(names_from = value, values_from = ProtVal)
ggplot(df, aes(x = treatment, y = mean)) + geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean-sd, ymax = mean+sd), width= 0.1) +
facet_wrap(time~Protein)
Also, I think stat = "identity" in geom_bar() was missing from Friederike's answer. I'd wager facet_wrap() also needs time, from what I can gather from the OP?
What have you tried? You seem to have the requirement mapped out very well, so translating it to ggplot2 aesthetics should be pretty straightforward. Start with
ggplot(dataset, aes(x=treatment, y=...)), before which you way want totidyr::pivot_widersomeanandsdbecome their own columns.