首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对某些行使用rollapply

对某些行使用rollapply
EN

Stack Overflow用户
提问于 2014-07-17 21:59:22
回答 2查看 978关注 0票数 1

我想知道是否可以仅对数据帧的某些行使用rollapply()。我知道"by“参数可以指定我计算乐趣的每个时间点,但是现在我有一个非常具体的行索引向量,我希望对其应用rollapply()。例如,我有下面的dataframe

代码语言:javascript
复制
df <- data.frame(x = (1:10), y = (11:20))

我知道当滚动宽度为3时,如何计算y柱的滚动平均值。

代码语言:javascript
复制
library(zoo)
m <- rollapply(df$y, width = 3, FUN = mean, fill = NA, align = "right")

但是,如果我只想要第4行和第9行的宽度-3-均值怎么办?"by“论点中有没有我可以操纵的东西?或者其他更好的方法(也许使用apply进行滚动计算)?

EN

回答 2

Stack Overflow用户

发布于 2018-01-01 02:34:41

希望我能正确理解你的问题。我想你是在问如何在滑动窗口中的每个第4个和第9个元素上执行函数?如果是,只需使用x4和x9将您的函数限制在第4和第9个元素。如下所示:

代码语言:javascript
复制
output <- rollapply(df, 9, function(x) (x[4] + x[9])/2), fill = NA, align = "right")

我还将你的问题解释为,当窗口包含第4行或第9行时,如何获得平均值?这可以通过子设置来完成。您需要考虑的问题是,您希望第4行和第9行位于窗口中的什么位置。是否希望第4行位于窗口中的位置x1、x2或x3?依赖于其他位置的内容将明显影响您的输出。假设你不知道,并且这三个看起来都是合理的,你将需要编写一个函数a来创建一个包含你感兴趣的数据范围的数据帧列表,然后使用apply函数或for循环,在列表中的每个数据帧上滚动应用均值函数。然后,您可以将所有这些输出放入一个数据帧中,以便进一步处理。如下所示:

代码语言:javascript
复制
# the rlist library has a function that allows us to add items to a list 
# which will be handy later on
library(rlist)
library(zoo)

# your example data
df <- data.frame(x = (1:10), y = (11:20))

# a vector of your desired rows
desired_rows <- c(4,9)

# A for loop that generates a list of dataframes
# with your desired rows in the middle of each
for (i in desired_rows){
  lower_bound <- i-2
  upper_bound <- i+2

  df_subset <- df[c(lower_bound:upper_bound), ]


  if(exists("list_df_range")){
    list_df_range <- list.append(list_df_range, df_subset)

  }else{

  list_df_range <- list(df_subset)

  }
}

# a second for loop that applies your rollapply function to each
# data frame in the list and then
# returns a dataframe of the final results
# with each column named after the originating row

for (n in list_df_range){

  m <- rollapply(n$y, width = 3, FUN = mean, fill = NA, align = "right")

  if(exists("final_out")){
    final_out <- cbind(final_out, m)

  }else{
    final_out <- data.frame(m)

  }

}


names(final_out) <- desired_rows
票数 0
EN

Stack Overflow用户

发布于 2018-01-01 05:28:28

根据发帖者问题下面的评论,似乎需要的是取每个窗口宽度为3的滚动窗口的平均值,不包括每个窗口中的中间元素,只保留第4和第9个元素

代码语言:javascript
复制
cc <- c(4, 9)

rollapply(df$y, list(c(-2, 0)), mean, fill = NA)[cc]
## [1] 13 18

代码语言:javascript
复制
rollapplyr(df$y, 3, function(x) mean(x[-2]), fill = NA)[cc]
## [1] 13 18

代码语言:javascript
复制
sapply(cc, function(ix) mean(df$y[seq(to = ix, by = 2, length = 2)]))
## [1] 13 18

代码语言:javascript
复制
(df$y[cc - 2] + df$y[cc]) / 2
## [1] 13 18
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24805640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档