我想知道是否可以仅对数据帧的某些行使用rollapply()。我知道"by“参数可以指定我计算乐趣的每个时间点,但是现在我有一个非常具体的行索引向量,我希望对其应用rollapply()。例如,我有下面的dataframe
df <- data.frame(x = (1:10), y = (11:20))我知道当滚动宽度为3时,如何计算y柱的滚动平均值。
library(zoo)
m <- rollapply(df$y, width = 3, FUN = mean, fill = NA, align = "right")但是,如果我只想要第4行和第9行的宽度-3-均值怎么办?"by“论点中有没有我可以操纵的东西?或者其他更好的方法(也许使用apply进行滚动计算)?
发布于 2018-01-01 02:34:41
希望我能正确理解你的问题。我想你是在问如何在滑动窗口中的每个第4个和第9个元素上执行函数?如果是,只需使用x4和x9将您的函数限制在第4和第9个元素。如下所示:
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循环,在列表中的每个数据帧上滚动应用均值函数。然后,您可以将所有这些输出放入一个数据帧中,以便进一步处理。如下所示:
# 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发布于 2018-01-01 05:28:28
根据发帖者问题下面的评论,似乎需要的是取每个窗口宽度为3的滚动窗口的平均值,不包括每个窗口中的中间元素,只保留第4和第9个元素
cc <- c(4, 9)
rollapply(df$y, list(c(-2, 0)), mean, fill = NA)[cc]
## [1] 13 18或
rollapplyr(df$y, 3, function(x) mean(x[-2]), fill = NA)[cc]
## [1] 13 18或
sapply(cc, function(ix) mean(df$y[seq(to = ix, by = 2, length = 2)]))
## [1] 13 18或
(df$y[cc - 2] + df$y[cc]) / 2
## [1] 13 18https://stackoverflow.com/questions/24805640
复制相似问题