首页 > 解决方案 > 通过使用下界和上界向量在矩阵上应用函数

问题描述

我有一个由数值组成的数据框。我计算了每列的标准偏差和平均值,并创建了Upper_Bound如下Lower_Bound向量:

std_devs = apply(exp_vars[,sapply(exp_vars,is.numeric)], 2, sd)
means = apply(exp_vars[,sapply(exp_vars,is.numeric)], 2, mean)
Upper_Bound = means + 3*std_devs
Lower_Bound = means - 3*std_devs

现在我想检测至少有一个值不在相关上限和下限之间的行。例如,列 j 中的值必须等于或大于 Lower_Bound[j] 且等于或小于 Upper_Bound[j],如果行 i 中的至少一个值违反此条件,我想保存该行的索引(I也有行名,保存行名也可以。)我想要获得的是一个索引向量(或行名),它显示了所有违反规则的行。我尝试了以下方法:

outliers = apply(my_data ,1, between(x,Lower_Bound, Upper_Bound,incbounds = TRUE))

但我想期望之间自动检查连续的每个值并将它们与相关边界进行比较是太多了。这是我第二次失败的绝望尝试:

outliers = apply(exp_vars_numeric,1, apply(x,2,between(x,Lower_Bound, Upper_Bound, incbounds = TRUE)))

我知道我可以用 for 循环来做到这一点,但我希望有一个更有效的解决方案。任何建议都受到高度赞赏。

提前致谢。

标签: rapply

解决方案


ave()考虑通过在 和的内联聚合的帮助下添加下限sd和上限列,将所有内容保存在一个数据框中mean。然后有条件ifelse()地运行这些行的标记。

num_cols <- sapply(exp_vars,is.numeric)
num_names <- colnames(exp_vars)[num_cols]

means <- sapply(exp_vars[,num_cols], function(x) ave(x, FUN=mean))
std_devs <- sapply(exp_vars[,num_cols], function(x) ave(x, FUN=sd))

exp_vars[,paste0(num_names, "_lower")] <- means - 3*std_devs
exp_vars[,paste0(num_names, "_upper")] <- means + 3*std_devs

# CONDITIONALLY ASSIGN FLAG COLS
exp_vars[,paste0(num_names, "_flag")] <- ifelse(exp_vars[,num_names] >= exp_vars[,paste0(num_names, "_lower")] &
                                                exp_vars[,num_names] <= exp_vars[,paste0(num_names, "_upper")], 1, 0)    
# ADD ALL FLAG COLS HORIZONTALLY
exp_vars$index <- ifelse(rowSums(exp_vars[,paste0(num_names, "_flag")]) > 0, row.names(exp_vars), NA)

exp_vars[is.na(exp_vars$index), ]

推荐阅读