【问题标题】:Replacing outlier with second minimum value group by in R在R中用第二个最小值组替换异常值
【发布时间】:2017-06-08 10:27:12
【问题描述】:

我是 R 新手,我有一个 data.table dt

> library(data.table)
> dt <- data.table(A = c(1,2,3,4,74,6, 7, 8, 9, 75, 11, 12), 
+                  B=c("P","P","P","P", "P", "P" ,"Q","Q","Q", "Q", "Q", "Q"), 
+                  C=c("a","b","c","d","e","f", "g", "h", "i", "j", "k", "l"))
> dt
     A B C
 1:  1 P a
 2:  2 P b
 3:  3 P c
 4:  4 P d
 5: 74 P e
 6:  6 P f
 7:  7 Q g
 8:  8 Q h
 9:  9 Q i
 10: 75 Q j
 11: 11 Q k
 12: 12 Q l

我计算了 A 值中的异常值,标准偏差使用以下方法

> #Outlier Identification by customer_count
> dt[,out := ifelse((A > (mean(A)+2*sd(A))|A < (mean(A)-2*sd(A))),1,0) ]
> dt
     A B C out
 1:  1 P a   0
 2:  2 P b   0
 3:  3 P c   0
 4:  4 P d   0
 5: 74 P e   1
 6:  6 P f   0
 7:  7 Q g   0
 8:  8 Q h   0
 9:  9 Q i   0
10: 75 Q j   1
11: 11 Q k   0
12: 12 Q l   0

“out”列表示我的异常值,现在我想将 A 中的异常值替换为每个组的第二个最小值为“B”。我该怎么做。

我的最终结果应该是这样的:

> dt
     A B C out
 1:  1 P a   0
 2:  2 P b   0
 3:  3 P c   0
 4:  4 P d   0
 5:  2 P e   1
 6:  6 P f   0
 7:  7 Q g   0
 8:  8 Q h   0
 9:  9 Q i   0
10:  8 Q j   1
11: 11 Q k   0
12: 12 Q l   0 

【问题讨论】:

    标签: r data.table outliers


    【解决方案1】:

    我们可以使用replace

    dt[, A := replace(A, out ==1, sort(A)[2]) , by = B]
    dt
    #     A B C out
    # 1:  1 P a   0
    # 2:  2 P b   0
    # 3:  3 P c   0
    # 4:  4 P d   0
    # 5:  2 P e   1
    # 6:  6 P f   0
    # 7:  7 Q g   0
    # 8:  8 Q h   0
    # 9:  9 Q i   0
    #10:  8 Q j   1
    #11: 11 Q k   0
    #12: 12 Q l   0
    

    或者另一种选择是

    dt[, A := pmax((out==1)*sort(A)[2], (out==0)*A), B]
    

    【讨论】:

    • ?sort 中似乎有一个部分排序选项,对于这样的情况可能值得使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2020-07-26
    • 2018-01-14
    • 2018-02-16
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多