如何解决R移动平均
作为示例,我将Boston
数据与3列(id(添加),medv,lstat)和506个观测值一起使用。
我想为变量medv计算k-1个观测值的移动平均值。这意味着应该对除某一行以外的所有观测值计算平均值。对于id 1,从2-506行计算出平均值。对于id 2,在第1行+ 3-506上计算平均值。对于id 3,通过1-2 + 4-506行计算平均值,依此类推。
第二步中,平均值的计算应是有条件的,例如在两个不同的列中位于中位数上方和下方。这意味着我们首先检查每列(medv和lstat)中的值是高于还是低于中位数。如果medv中的值高于中位数,我们将从高于lstat中位数的值中计算出lstat的平均值。如果medv中的值低于中位数,我们将根据中位数以下的值计算lstat的平均值。前10行请参见下面的示例表。 medv的前10行中位数为25.55,lstat的中位数为7.24。
以下是数据:
library(mlbench)
data(BostonHousing)
df <- BostonHousing
df$id <- seq.int(nrow(df))
df <- subset(df,select = c(id,medv,lstat))
id medv lstat mean1out meancond
1 24.0 4.98 26.66667 4.50
2 21.6 9.14 26.93333 4.50
3 34.7 4.03 25.47778 17.55
4 33.4 2.94 25.62222 17.55
5 36.2 5.33 25.31111 17.55
6 28.7 5.21 26.14444 17.55
7 22.9 12.43 26.78889 4.50
8 27.1 19.15 26.32222 17.55
9 16.5 29.93 27.50000 4.50
10 18.9 17.10 27.23333 4.50
解决方法
export interface LayerManager {
forCms: Function;
forProduct: Function;
}
export class LayerManager {
firstName: string = '';
constructor(name: string) {}
}
// @ts-ignore
if (process.env.NODE_ENV === "cms") {
LayerManager.prototype.forCms = function() {}
} else {
LayerManager.prototype.forProduct = function() {}
}
或者,在数学上,如果没有mean(dat$medv[-3])
# [1] 25.47778
sapply(seq_len(nrow(dat)),function(i) mean(dat$medv[-i]))
# [1] 26.66667 26.93333 25.47778 25.62222 25.31111 26.14444 26.78889 26.32222 27.50000 27.23333
,您可以通过以下方式获得相同的数字:
sapply
对于您的条件均值,简单的n <- nrow(dat)
(mean(dat$medv)*n - dat$medv)/(n-1)
# [1] 26.66667 26.93333 25.47778 25.62222 25.31111 26.14444 26.78889 26.32222 27.50000 27.23333
可以起作用:
ifelse
(我推断这些差异是数据输入中的舍入错误。)
,问题的第一部分已经由@ r2evans解决。
对于第二部分,我们可以计算median
和lstat
中的medv
,比较并分配值。
#First part from @r2evans answer.
n <- nrow(df)
df$mean1out <- (mean(df$medv)*n - df$medv)/(n-1)
#Second part
med_lsat <- median(df$lstat)
med_medv <- median(df$medv)
higher_lsat <- mean(df$lstat[df$lstat > med_lsat])
lower_lsat <- mean(df$lstat[df$lstat < med_lsat])
df$meancond <- ifelse(df$medv > med_medv,higher_lsat,lower_lsat)
df
# id medv lstat mean1out meancond
#1 1 24.0 4.98 26.66667 4.498
#2 2 21.6 9.14 26.93333 4.498
#3 3 34.7 4.03 25.47778 17.550
#4 4 33.4 2.94 25.62222 17.550
#5 5 36.2 5.33 25.31111 17.550
#6 6 28.7 5.21 26.14444 17.550
#7 7 22.9 12.43 26.78889 4.498
#8 8 27.1 19.15 26.32222 17.550
#9 9 16.5 29.93 27.50000 4.498
#10 10 18.9 17.10 27.23333 4.498
数据
df <- BostonHousing
df$id <- seq.int(nrow(df))
df <- subset(df,select = c(id,medv,lstat))
df <- head(df,10)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。