我正在尝试用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中编程。非常感谢你。 欢呼声。
答案 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