从R中的数据框添加要聚合的列

时间:2018-04-11 00:01:16

标签: r aggregate

我在数据框中有一些数据,在数据框中看起来像这样(头部),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`))

聚合可能吗?也就是说,我可以使用年计算最大聚合值,但是然后将它添加到数据框中匹配行的日期字段中吗?

谢谢!

3 个答案:

答案 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$datevaluedf中共享agg的{​​{1}}。要不抓取df中的所有变量,我将其限制为仅包含datevalue列。

# 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")

enter image description here

使用stat_summary也可能是一种聪明的方法。