R以特定的临界值进行Winsoring无效

时间:2019-05-20 20:13:28

标签: r trim desctools

我想使用变量的均值正负2个标准差作为截止点来对数据进行解冻。因此,我想逐个逐变量化每个变量。

我要在下面提供的示例代码中进行分类的变量有5个异常值。

我创建了两个基准(高和低),并将它们插入到minval和maxval中。 只是为了防止造成误解:我的数据框中有几个时间点和组,grepl部分是将一个组在一个测量点上进行抽奖。

到目前为止,我的代码:

library(DescTools)

benchhigh <- mean(ds$RRS[grepl('^34.*', ds$QUESTNNR)], na.rm=TRUE) + 
              2*sd(ds$RRS[grepl('^34.*', ds$QUESTNNR)], na.rm=TRUE)

benchlow <- mean(ds$RRS[grepl('^34.*', ds$QUESTNNR)], na.rm=TRUE) - 
              2*sd(ds$RRS[grepl('^34.*', ds$QUESTNNR)], na.rm=TRUE)

ds$RRSout <- Winsorize( ds$RRS[ grepl('^34.*', ds$QUESTNNR) ], 
                        minval = benchlow , maxval = benchhigh, na.rm = TRUE)

我得到的错误是:

  

$<-.data.frame*tmp*中的错误,RRSout,值= c(1,1.33333333333333,:     替换有38行,数据有510“

我的替代人只有38行,因为^ 34. *组只有38位参与者。不过,我必须根据每个组和测量点对异常值进行分类。

如何替换/取消保留RRS变量中特定参与者组的离群值?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

您对Winsorize()的输入仅限于某些观察(grepl('^34.*', ds$QUESTNNR))。您只能将结果附加到相同数量(最好是完全相同)的行上:

    ds$RRSout[ grepl('^34.*', ds$QUESTNNR) ] <- 
         Winsorize( ds$RRS[ grepl('^34.*', ds$QUESTNNR) ], 
                    minval = benchlow , maxval = benchhigh, na.rm = TRUE)