簡體   English   中英

使用R替換包含NA的數據幀中的多個列的異常值

[英]Replacing outliers from multiple columns in a dataframe containing NAs using R

我試圖通過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中編程。非常感謝你。 干杯。

我會研究使用apply和scale,scale會省略NAs。 以下代碼應該有效:

 # 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM