【问题标题】:R loop remove outliersR循环删除异常值
【发布时间】:2017-09-25 22:01:34
【问题描述】:

我正在尝试构建一个循环来删除异常值:

for (i in 1:ncol(df)){if (class(df[i,])=="numeric"){df[i,] <- df[df[i,] > quantile(df[i,],3/4)*3/2,]}}

我收到此错误:

Error in Ops.data.frame(df[i, ], quantile(df[i, ], 3/4) * 3/2) : 
  ‘>’ only defined for equally-sized data frames

【问题讨论】:

  • 您似乎混淆了行和列。假设df 是一个data.frame,df[i, ] 将是一个单行数据帧,它属于data.frame 类。尝试对列进行操作。还要确保您始终在括号中使用, i,您似乎缺少一个。

标签: r loops for-loop outliers


【解决方案1】:

我们可以通过使用 lapply 来加快速度。

c1 = rnorm(10)
c2 = rnorm(10)
c3 = LETTERS[1:10]


df = cbind.data.frame(c1, c2, c3)

myfun = function(x, probs){
  if(class(x) == "numeric"){
    x[x > quantile(x, probs)] = NA
    return(x)
  }else{
    return(x)
  }

}

示例data.frame是

> df
            c1          c2 c3
1  -0.21304047  0.34942938  A
2   0.12141663 -1.41734891  B
3  -0.09297657  0.57998739  C
4  -0.70925140 -0.52620644  D
5   1.02440427  0.02377832  E
6   0.43631554  0.19125312  F
7   0.53268566  2.25430880  G
8  -0.37624920  0.14218233  H
9   0.03863661 -0.44441846  I
10  1.26889396 -0.12077335  J

然后,我会事先记录分位数,以验证它是否有效

> quantile(df$c1, 3/4)
      75% 
0.5085931 

> quantile(df$c2, 3/4)
      75% 
0.3098853 

df = do.call(cbind.data.frame, lapply(df, myfun, 3/4))

> df


            c1          c2 c3
1  -0.21304047          NA  A
2   0.12141663 -1.41734891  B
3  -0.09297657          NA  C
4  -0.70925140 -0.52620644  D
5           NA  0.02377832  E
6   0.43631554  0.19125312  F
7           NA          NA  G
8  -0.37624920  0.14218233  H
9   0.03863661 -0.44441846  I
10          NA -0.12077335  J

所以我们确实得到了我们期望的输出。

要使用 for 循环来做到这一点,我们可以运行它

for(i in 1:ncol(df)) if(class(df[, i]) == "numeric") df[, i][df[,i] > quantile(df[,i], 3/4)] = NA

这给了我们相同的结果

> df
            c1          c2 c3
1  -0.21304047          NA  A
2   0.12141663 -1.41734891  B
3  -0.09297657          NA  C
4  -0.70925140 -0.52620644  D
5           NA  0.02377832  E
6   0.43631554  0.19125312  F
7           NA          NA  G
8  -0.37624920  0.14218233  H
9   0.03863661 -0.44441846  I
10          NA -0.12077335  J

然后,如果我们只想保留没有任何 NA 的行,我们可以运行它

df = df[complete.cases(df), ]

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2012-08-11
    • 2019-03-22
    • 2016-06-24
    • 2018-05-14
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多