Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R过去4,8,12行的中值-循环和组不工作,df过滤器也不工作_R_Loops_Filter_Subset_Median - Fatal编程技术网

R过去4,8,12行的中值-循环和组不工作,df过滤器也不工作

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

我需要计算过去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.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