我在数据框中有一些数据,在数据框中看起来像这样(头部),df:
site year date value
1 MLO 1969 1969-08-20 323.95
2 MLO 1969 1969-08-27 324.58
3 MLO 1969 1969-09-02 321.61
4 MLO 1969 1969-09-12 321.15
5 MLO 1969 1969-09-24 321.15
6 MLO 1969 1969-10-03 320.54
我使用aggregate()按年查找最大值:
ag <- aggregate(df$value ~ df$year, data=df, max)
这很好用,我在ag中有以下(头部):
df$year df$value
1 1969 324.58
2 1970 331.16
3 1971 325.89
4 1974 336.75
5 1976 333.87
6 1977 338.63
但是,我想绘制原始数据,然后对聚合中的数据进行分层,为了做到这一点,我需要一个具有完整日期字段(匹配最大值的字段)的列。换句话说,我需要聚合中的每个向量看起来像:
df$date df$year df$value
1 1969-08-27 1969 324.58
依此类推,所以我可以这样geom_point:
sp <- ggplot(df, aes(x=date, y=value)) +
labs(x="Year", y="Value")
sp + geom_point(colour="grey60", size=1) +
geom_point(data=ag, aes(x=`df$date`,
y=`df$value`))
聚合可能吗?也就是说,我可以使用年计算最大聚合值,但是然后将它添加到数据框中匹配行的日期字段中吗?
谢谢!
答案 0 :(得分:2)
使用dplyr
并制作数据的解决方案
library(dplyr)
df <- data.frame(year = c(1969, 1969, 1969, 1970, 1970), date = c("1969-08-20", "1969-08-21", "1969-08-22", "1970-08-20", "1969-08-21"),
value = c(1,3,2, 10, 8))
df %>% group_by(year) %>% summarise(max_val = max(value),
max_date = date[which.max(value)])
# A tibble: 2 x 3
year max_val max_date
<dbl> <dbl> <chr>
1 1969. 3. 1969-08-21
2 1970. 10. 1970-08-20
答案 1 :(得分:1)
您可以使用base::merge()通过inner-join分配df$date
在value
和df
中共享agg
的{{1}}。要不抓取df
中的所有变量,我将其限制为仅包含date
和value
列。
# load data
df <-
read.table(
text = "site year date value
MLO 1969 1969-08-20 323.95
MLO 1969 1969-08-27 324.58
MLO 1969 1969-09-02 321.61
MLO 1969 1969-09-12 321.15
MLO 1969 1969-09-24 321.15
MLO 1969 1969-10-03 320.54"
, header = TRUE
, stringsAsFactors = FALSE )
# calculate max value by year
ag <- aggregate( formula = value ~ year, data = df, FUN = max )
# grab the date from df that matches
# the value from agg
ag <-
merge( x = ag
, y = df[c("date", "value")]
, by = "value"
, all = FALSE ) # to indicate that an inner-join be performed
# view results
ag
# value year date
# 1 324.58 1969 1969-08-27
# end of script #
答案 2 :(得分:0)
您可以使用dplyr::mutate
代替aggregate
来创建一个具有年份最大值的新列。然后,您可以将单独的geom映射到原始变量和新列。我用彩色线表示聚合。
使用2年的示例数据:
df1 <- structure(list(site = c("MLO", "MLO", "MLO", "MLO", "MLO", "MLO"),
year = c(1970, 1970, 1970, 1969, 1969, 1969),
date = c("1970-08-20", "1970-08-27", "1970-09-02",
"1969-09-12", "1969-09-24", "1969-10-03"),
value = c(323.95, 324.58, 321.61, 321.15, 321.15, 320.54)),
class = "data.frame",
.Names = c("site", "year", "date", "value"),
row.names = c(NA, -6L))
library(tidyverse)
df1 %>%
group_by(year) %>%
mutate(maxVal = max(value)) %>%
ungroup() %>%
ggplot() +
geom_point(aes(date, value)) +
geom_line(aes(date, maxVal, group = year), color = "red")
使用stat_summary
也可能是一种聪明的方法。