使用Rank()信息按行删除分数

时间:2017-06-01 20:25:04

标签: r

我正在尝试手动检查数据帧每行内的异常值。要做到这一点,我想连续删除最高分(忽略缺失值),计算分数的上限(剩余分数的平均值加上标准差乘以2.5)。然后将删除的最高分数与上限进行比较。如果分数较低,那么我想将分数返回到数据框。

Score 1     Score 2    Score 3   Score 4    Score 5    Score 6    
2834.0000  3390.0000  932.4050  1088.4851  1047.3301  1059.3850 
1409.2500     NA         NA     1256.8899   868.0601  1480.8149

不幸的是,没有一致的水平,分数高于或包含分数的列。例如,第1行中的最高分数在第2列中为3390,而第2行中的最高分数在第6列中为1480.8149。

我最接近的是应用rank()来识别每行中的最大分数。我还应用scale()来计算每行每个分数的z分数(但是,它基于可能膨胀的平均值)。但现在我不知道如何使用该信息来删除单独数据帧上的分数。

我是R的新手,所以如果有一个简单的命令解决这个问题,请原谅我。

1 个答案:

答案 0 :(得分:0)

我认为这应该做你想要的:

t(apply(dat, 1, function(r){
    r_new <- r #new vector
    find_max <- which(r_new == max(r_new, na.rm = TRUE)) #find max value
    r_new[find_max] <- NA #replace with NA
    #calculate upper
    upper <- mean(r_new, na.rm = TRUE) + (2.5) * sd(r_new, na.rm = TRUE)
    # replace if necessary
    if(all(upper > r[find_max])){ # use all in case of ties
        r_new[find_max] <- r[find_max]
    }
    r_new #return new vector        
}))

      Score1 Score2  Score3   Score4    Score5   Score6
[1,] 2834.00   3390 932.405 1088.485 1047.3301 1059.385
[2,] 1409.25     NA      NA 1256.890  868.0601 1480.815

我们使用apply来迭代您的数据行。然后,我们查看每行中的最大值,将其设置为NA,计算上限,检查上限是否大于最大值。