R过去4,8,12行的中值-循环和组不工作,df过滤器也不工作
我需要计算过去4、8、12周的不同中位数(周是偶数)。但该小组并不是在为循环工作。请参阅下面的代码 我有一个数据帧:R过去4,8,12行的中值-循环和组不工作,df过滤器也不工作,r,loops,filter,subset,median,R,Loops,Filter,Subset,Median,我需要计算过去4、8、12周的不同中位数(周是偶数)。但该小组并不是在为循环工作。请参阅下面的代码 我有一个数据帧: keyword - hits - date wine - 23 - 01.01.2020 wine - 20 - 01.08.2020 wine - 5 - 01.15.2020 food - 21 - 01.01.2020 food - 8 - 01.08.2020 food - 4 - 01.15.2020 other - 19 - 01.01
keyword - hits - date
wine - 23 - 01.01.2020
wine - 20 - 01.08.2020
wine - 5 - 01.15.2020
food - 21 - 01.01.2020
food - 8 - 01.08.2020
food - 4 - 01.15.2020
other - 19 - 01.01.2020
other - 12 - 01.08.2020
other - 11 - 01.15.2020
etc...
summary3 <- summary2 %>% group_by(keyword)
for (i in 1:nrow(summary3)) {
if (i < "9") {
summary3$median8[i] = i
}
else
summary3$median8[i] = median(summary3$hits[(i-1):(i-8)])
}
for (i in 1:nrow(summary3)) {
if (i < "5") {
summary3$median4[i] = i
}
else
summary3$median4[i] = median(summary3$hits[(i-1):(i-4)])
}
for (i in 1:nrow(summary3)) {
if (i < "13") {
summary3$median12[i] = i
}
else if (i < "13") {
summary3$median12[i] = median(summary3$hits[(i-1):(i-12)])
}
}
关键字-点击次数-日期
葡萄酒-23-01.01.2020
葡萄酒-20-01.08.2020
葡萄酒-5-01.15.2020
食品-21-01.01.2020
食品-8-01.08.2020
食品-4-01.15.2020
其他-19-01.01.2020
其他-12-01.08.2020
其他-11-01.15.2020
等
汇总3%分组依据(关键字)
对于(1:nrow中的i(摘要3)){
如果(i<“9”){
汇总3$median8[i]=i
}
其他的
总和3$median8[i]=中值(总和3$hits[(i-1):(i-8)])
}
对于(1:nrow中的i(摘要3)){
如果(i<“5”){
汇总3$median4[i]=i
}
其他的
总和3$median4[i]=中值(总和3$hits[(i-1):(i-4)])
}
对于(1:nrow中的i(摘要3)){
如果(i<“13”){
汇总3$median12[i]=i
}
否则,如果(i<“13”){
总和3$median12[i]=中值(总和3$hits[(i-1):(i-12)])
}
}
我还尝试了dataframe文件管理器方法。但是当我尝试分轨1和8时,PID显示不正确。PID=标识每个关键字组中的行
#summary3 <- summary2 %>% group_by(keyword) %>% mutate(pid = row_number())
#summary3$median8 <- median(summary3$hits[lag(summary3$pid, k=1) : lag(summary3$pid), k=8])
#summary3%group\u by(关键字)%%>%mutate(pid=row\u number())
#summary3$median8以下内容基于{tidyverse}
,即{dplyr}
,以及漂亮的“滚动窗口”{runner}
包。后者可以避免创建和调整周ID(或PID),然后对其进行迭代
我需要模拟一些数据,因为您没有提供可复制的示例。但您可以很容易地将其应用于您的数据。我还将我的示例限制为4周和8周
library(dplyr)
# simulate some data
set.seed(666)
# create weekly timeseries
dates <- seq(from = lubridate::ymd("2020-01-01"), to = lubridate::ymd("2020-05-01")
,by = "1 week")
# example dataframe with weeks, the wine/food/other, and some random hits
df <- data.frame(
keyword = c( rep("wine", length.out = length(dates))
,rep("food", length.out = length(dates))
,rep("other", length.out = length(dates))
)
, hits = sample(4:25, size = 3 * length(dates), replace = TRUE) # random integers
, date = rep(dates, times = 3)
)
这就产生了
# A tibble: 54 x 5
keyword hits date ROLL_MEAN_LAST4 ROLL_MEAN_LAST8
<chr> <int> <date> <dbl> <dbl>
1 wine 14 2020-01-01 14 14
2 wine 17 2020-01-08 15.5 15.5
3 wine 8 2020-01-15 13 13
4 wine 12 2020-01-22 12.8 12.8
5 wine 15 2020-01-29 13 13.2
6 wine 4 2020-02-05 9.75 11.7
7 wine 21 2020-02-12 13 13
8 wine 6 2020-02-19 11.5 12.1
9 wine 8 2020-02-26 9.75 11.4
10 wine 16 2020-03-04 12.8 11.2
#一个tible:54 x 5
关键词命中日期滚动\u平均值\u LAST4滚动\u平均值\u LAST8
1葡萄酒14 2020-01-01 14
2葡萄酒17 2020-01-08 15.5 15.5
3葡萄酒8 2020-01-15 13
4葡萄酒12 2020-01-22 12.8 12.8
5葡萄酒15 2020-01-29 13.2
6葡萄酒4 2020-02-05 9.75 11.7
7葡萄酒21 2020-02-12 13
8葡萄酒6 2020-02-19 11.5 12.1
9葡萄酒8 2020-02-26 9.75 11.4
10葡萄酒16 2020-03-04 12.8 11.2
注意:如果您需要偏移滚动窗口等,请查看跑步者文档。例如,解决方案计算部分时间范围的平均值(第一周平均值基于一周,第二周平均值基于前两周)。您好,请举例说明?目前,它会产生许多错误,如未知或未初始化列
。。。此外,若要共享数据,请使用dput()
,以便在出现格式问题时更容易发现。此外,您还应应用其他问题答案中的建议:
library(runner)
df %>%
group_by(keyword) %>%
mutate(
ROLL_MEAN_LAST4 = runner(
x = hits
,k = "4 weeks"
,idx = date
,f = mean
)
, ROLL_MEAN_LAST8 = runner(
x = hits
,k = "8 weeks"
,idx = date
,f = mean
)
) %>%
ungroup()
# A tibble: 54 x 5
keyword hits date ROLL_MEAN_LAST4 ROLL_MEAN_LAST8
<chr> <int> <date> <dbl> <dbl>
1 wine 14 2020-01-01 14 14
2 wine 17 2020-01-08 15.5 15.5
3 wine 8 2020-01-15 13 13
4 wine 12 2020-01-22 12.8 12.8
5 wine 15 2020-01-29 13 13.2
6 wine 4 2020-02-05 9.75 11.7
7 wine 21 2020-02-12 13 13
8 wine 6 2020-02-19 11.5 12.1
9 wine 8 2020-02-26 9.75 11.4
10 wine 16 2020-03-04 12.8 11.2