使用R替换包含NA的数据帧中的多个列的异常值

时间:2014-11-11 05:19:45

标签: r dataframe

我正在尝试用NA替换大数据集(超过3000列和250000行)中的异常值。我想用NA替换平均值大于或小于3个标准差的观测值。我得到了它,逐列完成:

height = ifelse(abs(height-mean(height,na.rm=TRUE)) < 3*sd(height,na.rm=TRUE),height,NA)

但是,我想创建一个函数来在列的子集中执行此操作。为此,我创建了一个列表,其中包含我想要替换异常值的列名。但它没有用。
有人可以帮帮我吗?

我的数据集的一个例子是:

name = factor(c("A","B","C","D","E","F","G","H","H"))
height = c(120,NA,150,170,NA,146,132,210,NA)
age = c(10,20,0,30,40,50,60,NA,130)
mark = c(100,0.5,100,50,90,100,NA,50,210)
data = data.frame(name=name,mark=mark,age=age,height=height)
data

这是我的最后一次尝试:

d1=names(data)
list = c("age","height","mark")
ntraits=length(list)
nrows=dim(data)[1]
for(i in 1:ntraits){
a=list[i]
b=which(d1==a)
d2=data[,b]
for (j in 1:nrows){
                  d2[j] = ifelse(abs(d2[j]-mean(d2,na.rm=TRUE)) < 3*sd(d2,na.rm=TRUE),d2[j],NA)
                  }
}

抱歉,我还在学习如何在R中编程。非常感谢你。 欢呼声。

1 个答案:

答案 0 :(得分:1)

我会研究使用apply和scale,scale会省略NA。以下代码应该有效:

 # get sd for a subset of the columns
 data.scale <-  scale(data[ ,c("age","height","mark") ])

 # set outliers to NA
 data.scale[ abs(data.scale) > 3 ] <- NA

 # write back to the data set
 data[ ,c("age","height","mark") ] <- data.scale