在R语言中,根据列中的日期计算平均值。

3
我正在尝试根据某一列中的日期计算平均值。可以选择前几天的记录,例如4天。获取前4条记录的平均值减去StartDate,并将平均值向下滚动,直到有EndDate。

我尝试了

tapply(df$Boe, df$ShutinDate, function(x) mean(tail(sort(x), 5)))

我在编写函数时没有得到正确的平均值。

输出结果

Name    DATE    Values  StartDate   EndDate    Average
TestA   3/3/2017    50          
TestA   3/4/2017    75          
TestA   3/5/2017    25          
TestA   3/6/2017    100         
TestA   3/7/2017    100         
TestA   3/8/2017    50          
TestA   3/9/2017    80          
TestA   3/10/2017   90          
TestA   3/11/2017   25             3/11/2017        
TestA   3/12/2017   0                           80
TestA   3/13/2017   0                           80
TestA   3/14/2017   0                           80
TestA   3/15/2017   0                           80
TestA   3/16/2017   50      3/16/2017   

请使用 dput(df) 将您的数据复制并尝试解决问题。提供所需输出的示例也是不错的。 - Calum You
2个回答

1

1) 我们按名称分组(假设每个Name都应单独执行rollapply),然后使用width = list(-seq(4))rollapply,它对每个mean的应用使用偏移量-1、-2、-3、-4。(偏移量0将是当前点,但我们想要这里的前4个。)

不清楚您所指的起始时间,因此该部分已省略。另外,我假设数据已排序(这是问题中的情况)。您可能还希望将日期转换为"Date"类,但如果行已排序,则不需要回答问题。

library(zoo)

roll <- function(x) rollapply(x, list(-seq(4)), mean, fill = NA)
transform(DF, Average = ave(Values, Name, FUN = roll))

2) 或者如果您喜欢 dplyr,那么可以使用上面的 roll

library(dplyr)
library(zoo)

DF %>% 
   group_by(Name) %>% 
   mutate(Average = roll(Values)) %>% 
   ungroup()

谢谢您建议我查看这个答案。我已经学习了第二部分,但还没有能够将其应用到我的情况中。https://stackoverflow.com/questions/50023898/compute-a-rolling-weighted-sum-by-group - Bobby

0
一个选项是使用 zoo::rollapply 以及 dplyr::lag,如下所示:
library(dplyr)
library(lubridate)
library(zoo)

df %>% mutate(DATE = mdy(DATE)) %>%   #Convert to Date
  arrange(Name, DATE) %>%             #Order on Name and DATE
  mutate(Avg = rollapply(Values, 4, mean, fill= NA, align = "right")) %>%
  mutate(Average = lag(Avg)) %>%      # This shows mean for previous 4 rows
  select(-Avg)
#     Name       DATE Values Average
# 1  TestA 2017-03-03     50      NA
# 2  TestA 2017-03-04     75      NA
# 3  TestA 2017-03-05     25      NA
# 4  TestA 2017-03-06    100      NA
# 5  TestA 2017-03-07    100   62.50
# 6  TestA 2017-03-08     50   75.00
# 7  TestA 2017-03-09     80   68.75
# 8  TestA 2017-03-10     90   82.50
# 9  TestA 2017-03-11     25   80.00
# 10 TestA 2017-03-12      0   61.25
# 11 TestA 2017-03-13      0   48.75
# 12 TestA 2017-03-14      0   28.75
# 13 TestA 2017-03-15      0    6.25
# 14 TestA 2017-03-16     50    0.00

数据:

df <- read.table(text = 
"Name    DATE    Values  
TestA   '3/3/2017'    50          
TestA   '3/4/2017'    75          
TestA   '3/5/2017'    25          
TestA   '3/6/2017'    100         
TestA   '3/7/2017'    100         
TestA   '3/8/2017'    50          
TestA   '3/9/2017'    80          
TestA   '3/10/2017'   90          
TestA   '3/11/2017'   25  
TestA   '3/12/2017'   0   
TestA   '3/13/2017'   0   
TestA   '3/14/2017'   0   
TestA   '3/15/2017'   0   
TestA   '3/16/2017'   50",
header = TRUE, stringsAsFactors = FALSE) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接