如何在R中用星期和城市来表示意思?

问题描述 投票:0回答:2

我有一个date.frame是这样的。

#         city          date       pm2.5      
#1       beijing       2018-1-1      12.5  
#2       beijing       2018-1-2       14 
#3       beijing       2018-1-3       15  
          ...           ...           ...
#365     beijing       2018-12-31     50
#366     shanghai      2018-1-1       14
#367     shanghai      2018-1-2       15
          ...             ...         ...
#730     shanghai      2018-12-31     60

如何计算变量的平均值 pm2.5weekscity...会是这样的。

理想的输出。

#         city          weeks       pm2.5      
#1       beijing          1        13  
#2       beijing          2        14 
#3       beijing          3        15  
          ...           ...           ...
#42     beijing          42       50
#43     shanghai          1       14
#44     shanghai          2       15
          ...           ...         ...
#84     shanghai          42       55

我试过用 "apply.weekly",但没有成功。

非常感谢。

r aggregate
2个回答
2
投票

使用 aggregate. 使用 transform的数据,在您 format 您的日期 %Week数字。例子。

res <- aggregate(value ~ week + city, data=transform(dat, week=format(date, "%W")), mean)
res[1:5, ]
#    week city    value
# 1   00    A 6.500000
# 2   01    A 6.857143
# 3   02    A 4.857143
# 4   03    A 5.857143
# 5   04    A 5.714286

res[52:57, ]
#    week city    value
# 52   51    A 5.714286
# 53   52    A 3.500000
# 54   00    B 6.500000
# 55   01    B 5.000000
# 56   02    B 3.285714
# 57   03    B 5.428571

,你需要的日期变量格式为 "date",即当你把它当成了 "character" 格式,您需要做的是 dat$date <- as.Date(dat$date) 事先。


玩具数据

dat <- expand.grid(city=LETTERS[1:3],
            date=seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), "day"))
set.seed(42)
dat$value <- sample(1:10, nrow(dat), replace=T)

0
投票

试试这个。

首先将日期转换为星期,然后计算每个城市和每个星期的平均数,用以下方法计算 group_by.

你需要 dplyr 为此。

library(dplyr)

data.frame_result = data.frame1 %>%
  mutate(weeks = format(as.Date(date, "%Y-%m-%d"), "%V")) %>%
  group_by(city, weeks) %>%
  summarize(avgPM25 = mean(as.numeric(pm2.5))) %>%
  ungroup()
© www.soinside.com 2019 - 2024. All rights reserved.