【问题标题】:Correcting errors in variables, by taking the median by group for outliers通过对异常值按组取中位数来纠正变量中的错误
【发布时间】:2020-12-08 23:10:08
【问题描述】:

示例数据:

library(data.table)
set.seed(1)
DT <- data.table(panelID = sample(10,10),                                                   
                      some_NA = sample(0:5, 6),                                             
                      some_NA_factor = sample(0:5, 6),         
                      Group = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)),
                      Time = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5),
                      wt = 15*round(runif(100)/10,2),
                      Income = round(rnorm(10,-5,5),2),
                      Happiness = sample(10,10),
                      Sex = round(rnorm(10,0.75,0.3),2),
                      Age = sample(100,100),
                      Height= 150*round(rnorm(10,0.75,0.3),2))           

# ERRORS
DT [1:5,11]  <- 0                                                                

我在Height 注册我的数据时出现了一些错误。由于数据是面板数据,我应该能够从其他观察中推断出实际的Height。为了自动化这个过程,如果值距离中位数超过 50 厘米,我想用中位数替换一个值:

setDT(DT)[abs(median(Height, na.rm = TRUE) - Height) > 50 , newheight := median(Height, na.rm = TRUE), by=panelID]

by 参数不知何故不起作用,导致以下结果:

> table(DT$newheight)

  0  27 165 
  4  10  10 

谁能告诉我我做错了什么?

【问题讨论】:

    标签: r syntax data.table median


    【解决方案1】:

    试试:

    setDT(DT)
    DT[ , newheight := ifelse(abs(median(Height, na.rm = TRUE) - Height) > 50, median(Height, na.rm = TRUE), Height), by=.(panelID)]
    

    【讨论】:

      【解决方案2】:

      您的问题在于操作顺序。首先,过滤器(即逗号前的位)被应用于整个表,所以这里计算的中值是整个高度列的中值。然后,逗号后的位被应用到每个组中,过滤后的数据。所以你实际上使用的是离群值的中位数,而不是整个组的中位数(我认为这是你想要的)。

      一种解决方法可能是分阶段进行:

      setDT(DT)
      DT[, median.height:= median(Height, na.rm = TRUE), by='panelID']
      DT[abs(Height - median.height) > 50, newheight:= median.height]
      

      或者,您可能打算用此替换最后一行:

      DT[, newheight:= fifelse(abs(Height - median.height) > 50, median.height, Height)]
      

      【讨论】:

      • 非常感谢您的回答。我指的是后一种选择!
      猜你喜欢
      • 2021-06-26
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      相关资源
      最近更新 更多