r - 通过使用下界和上界向量在矩阵上应用函数
问题描述
我有一个由数值组成的数据框。我计算了每列的标准偏差和平均值,并创建了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 循环来做到这一点,但我希望有一个更有效的解决方案。任何建议都受到高度赞赏。
提前致谢。
解决方案
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), ]
推荐阅读
- django - Django allauth 无效令牌错误未显示
- java - 编译器跳过字符串值数据成员
- javascript - 检查数组中的至少两个元素是否大于零 - JavaScript/Typescript
- r - 使用变量替换 R 中的确切字符串
- python - Python:将一个整数数组与 1 个空数组连接起来
- sql - ORACLE SQL如何使用自定义函数iside insert cte
- reactjs - 如何使用 jest 为 ReactTable(react table v6 库)编写单元测试用例
- oracle - Oracle APEX 源代码框架在哪里
- flutter - DateTime 对象不适用于 Dart 中的集合-if 功能
- ios - Alamofire 5.0 与 AlamofireNetworkActivityIndicator 2.4