我正在尝试手动检查数据帧每行内的异常值。要做到这一点,我想连续删除最高分(忽略缺失值),计算分数的上限(剩余分数的平均值加上标准差乘以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的新手,所以如果有一个简单的命令解决这个问题,请原谅我。
答案 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
,计算上限,检查上限是否大于最大值。