我想在R中运行分区回归,为此我需要分配一个因子以指示该数据所属的分区。例如,当它大于均值+2标准差时,我将指标2分配给均值+ 1sd和均值+ 2sd之间,以此类推。我知道可以通过if and else完成。但是,当分区太多时,代码似乎太长。有没有简单而简洁的方法来实现它?
mean=mean(x)
sd=sd(x)
if((x[i]-mean)/sd< -3) signal[i]=-3
if((x[i]-mean)/sd> -3) signal[i]=-2
if((x[i]-mean)/sd> -2) signal[i]=-1
if((x[i]-mean)/sd> -1) signal[i]=0
if((x[i]-mean)/sd>1) signal[i]=1
if((x[i]-mean)/sd>2) signal[i]=2
if((x[i]-mean)/sd>3) signal[i]=3
}
感谢@jogo和@ r.user.05apr。 现在我有一个稍微不同的问题。我想基于滚动窗口(例如20天)计算分区,这意味着我需要根据过去20天(从t-20天到t-1天)缩放t天的数据,并分配与根据其z得分。在这种情况下,仍然可以使用剪切功能吗?我写了一个带有循环的代码,如果有句子
signal <- vector()
n=20 #window
for(i in (n+1):length(x)){
mean=mean(x[(n-20):(n-1)])
sd=sd(x[(i-20):(i-1)])
if((x[i]-mean)/sd< -3) signal[i]=-3
if((x[i]-mean)/sd> -3) signal[i]=-2
if((x[i]-mean)/sd> -2) signal[i]=-1
if((x[i]-mean)/sd> -1) signal[i]=0
if((x[i]-mean)/sd>1) signal[i]=1
if((x[i]-mean)/sd>2) signal[i]=2
if((x[i]-mean)/sd>3) signal[i]=3
}
答案 0 :(得分:6)
您可以使用cut()
x <- iris$Petal.Length
m <- mean(x)
s <- sd(x)
cut((x - m)/s, breaks = c(-Inf, -3, -2, -1, 1, 2, 3, +Inf), labels = c((-3):3))
强制转换为数字:
as.numeric(as.character(cut((x - m)/s, breaks = c(-Inf, -3, -2, -1, 1, 2, 3, +Inf), labels = c((-3):3))))
您可以将(x - m)/s
缩短为scale(x)
答案 1 :(得分:-1)
取决于值分配的动态程度。替代选项:
id name
=========== ==============
1 Row 1
2 Row 2
!!! ---> 3 Row 4