【问题标题】:How do I calculate the mean of a column by a factor - R [closed]如何通过因子计算列的平均值 - R [关闭]
【发布时间】:2020-08-17 08:34:22
【问题描述】:

我对 R 很陌生。我正在尝试计算“Temperature.10m”列的每日平均值。

我试过了:

aggregate(x=AverageData$Temperature.10m, by= list(AverageData$Day), FUN = mean)

基于其他帖子,但我没有得到正确的值。该数据集包含每天每小时的温度。附上数据集的图片。

【问题讨论】:

  • 你有'Temerature.10m'的numeric
  • 没有一个可重复的小例子,很难知道确切的问题
  • 每天的意思是年/月/日的意思吗?
  • “没有得到正确的值”是什么意思?回答者目前只能猜测......请edit您的问题更具体。另请参阅“It’s not working” is not helpful

标签: r statistics data-analysis


【解决方案1】:

这是一种方法,首先使用ISOdateas.Date 创建一个Date 列。需要调用as.Date,因为ISOdate 将时间设置为12:00:00。

df1$Date <- with(df1, ISOdate(Year, Month, Day))
df1$Date <- as.Date(df1$Date)

现在aggregateDate 计算平均值。

aggregate(Temperature.10m ~ Date, df1, mean, na.rm = TRUE)
#        Date Temperature.10m
#1 2016-04-17       -15.72627
#2 2016-04-18       -14.91346
#3 2016-04-19       -15.76245

或者,使用包dplyr

library(dplyr)

df1 %>%
  group_by(Date) %>%
  summarise(MeanTemp = mean(Temperature.10m, na.rm = TRUE))
## A tibble: 3 x 2
#  Date       MeanTemp
#  <date>        <dbl>
#1 2016-04-17    -15.7
#2 2016-04-18    -14.9
#3 2016-04-19    -15.8

数据创建代码

set.seed(1234)
Hour <- 0:23
Day <- 18:20
Month <- 4
Year <- 2016
df1 <- expand.grid(Year, Month, Day, Hour)
names(df1) <- c("Year", "Month", "Day", "Hour")
df1 <- df1[with(df1, order(Year, Month, Day, Hour)), ]
df1$Temperature.10m <- runif(nrow(df1), -20, -10)

【讨论】:

    【解决方案2】:

    由于数据包含年、月和日字段,因此日平均温度可能会按小时汇总,并且必须通过 YearMonthDay 的组合来计算。

    library(dplyr)
    AverageData %>% group_by(Year,Month,Day) %>%
       summarise(avg = mean(Temperature.10m, na.rm = TRUE))
    

    如果需要Site 的不同日平均温度,它也必须包含在group_by() 中。

    library(dplyr)
    AverageData %>% group_by(Site,Year,Month,Day) %>%
       summarise(avg = mean(Temperature.10m, na.rm = TRUE))
    

    可以通过将年、月和日信息组合到单个日期变量中来简化这一过程。一种方法是使用lubridate

    library(lubridate)
    AverageData$date <- ymd(sprintf("%4d-$02d-%02d",AverageData$year,AverageData$month,AverageData$day))
    

    现在,dplyr 中的跨站点每日平均值将如下所示。

    library(dplyr)
    AverageData %>% group_by(date) %>%
       summarise(avg = mean(Temperature.10m, na.rm = TRUE))
    

    【讨论】:

    • 这很好用!!非常感谢您的澄清
    • @VanessaMadrid - 谢谢,Vanessa。如果回答对您有帮助,请采纳。此外,如果您阅读 How to create a minimal reproducible example 并在您的问题中包含一小部分数据,您将更快地获得更多相关帮助。
    【解决方案3】:

    数据集可能有一些缺失值 (NA)。一个选项是使用na.action

    aggregate(Temperature.10m ~ Day, AverageData, mean, na.rm = TRUE, na.action = NULL)
    

    或使用dplyr

    library(dplyr)
    AverageData %>%
         group_by(Day) %>%
         summarise(Mean = mean(Temperature.10m, na.rm = TRUE))
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 2021-07-05
      • 2021-11-30
      • 2012-03-09
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多