如何在r

时间:2018-07-02 12:56:28

标签: r

我想在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
}

2 个答案:

答案 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