一次替换和删除数据帧或多列中的第一个和最后一个百分位数

标签 r

我有这个数据集:

A <- paste0("event_", c(1:100))
some_number <- sample.int(1000,size=100) 
X1 <- c(1:100)
X2 <- c(101:200)
X3 <- c(201:300)
X4 <- c(301:400)
X5 <- c(401:500)
DF <- data.frame(A, some_number, X1, X2, X3, X4, X5)

当我处理异常值时,我希望删除包含第一个和最新百分位的行,仅考虑用于百分位计算的 X 变量和所有 X 变量作为一组。因此,百分位数会将 X1X5 视为一个组。为此,我想到了以下步骤:

  1. X1X5 的值替换为 1 到 100(每个百分位 1)。请记住,我不是在查找每个 X 的百分位数,而是查找所有 X 的整体。
  2. 删除变量X1X5包含1或100的行

我的尝试:(基于 how to find percentilesreplace outliers with the 5th and 95th percentileremove data greater than 95th percentile in data frame )

as.data.frame(sapply(select(DF, X1:X5), function (x) {
     qx <- quantile(x, probs = c(1:100)/100)
     cut(x, qx, labels = c(1:100))
}))

但是..我的尝试引发了错误,即中断数量与标签数量不同,我正在努力分配新的数据帧而不丢失 Asome_number 变量(在我的实际问题中,它们不是两列,而是近 50 个)

有什么建议吗?

最佳答案

dplyr中同时使用acrossc_across,你也可以这样做-

步骤说明 -

  • c_across 通常与 row_wise 一起使用,因为它创建通过其内部参数子集化的数据的完整副本。但我是在没有 rowwise() 的情况下完成的,因此它不是创建一行,而是根据需要创建整个数据的副本。
  • 此后将推导出该数据的两个分位数。 (这将是标量)
  • 现在剩下的唯一工作就是检查这些值与数据中的所有其他值。所以我在这里直接使用了cross
  • 使用 across 我构建了一个 lambda 公式,该公式以 twiddle 开头,其参数仅为 .。这个旋转风格的公式 ~ . 相当于 function(x) x ,其余的很清楚。
DF %>% mutate(across(starts_with('X'), ~ifelse(. > quantile(c_across(starts_with('X')), 0.99) |
                                                 . < quantile(c_across(starts_with('X')), 0.01),
                                               NA, .) 
                     )) %>% na.omit()

#>           A some_number X1  X2  X3  X4  X5
#> 6   event_6          69  6 106 206 306 406
#> 7   event_7         871  7 107 207 307 407
#> 8   event_8         356  8 108 208 308 408
.
.
.
#> 93 event_93         432 93 193 293 393 493
#> 94 event_94         967 94 194 294 394 494
#> 95 event_95         516 95 195 295 395 495

由于 starts_with 仅适用于 acrossc_across 并避免此处较慢的 rowwise,我们也可以这样做直接这个

DF %>% filter(rowSums(cur_data()[str_detect(names(DF), 'X')] > quantile(c_across(starts_with('X')), 0.99)) == 0 &
                rowSums(cur_data()[str_detect(names(DF), 'X')] < quantile(c_across(starts_with('X')), 0.01)) == 0)

这还将根据需要提供 90 行输出

关于一次替换和删除数据帧或多列中的第一个和最后一个百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67896918/

相关文章:

r - 如何在 dplyr 中定义函数? - 添加卡方检验的结果

r - 寓言预测数据集请求和功能

R:几个向量之间的所有交集

r - 使用 R 进行 ARIMA 建模的奇怪案例

r - 如何从R中的wav文件获取频率和时间的数据帧?

r - 从 R 中的人口中抽取固定数量的实例

r - 列表中最长元素的长度

r - 如何在 Markdown 标题中强制换行?

r - 在 R 中优化带有约束的曲线组合

r - 如何在尚未导出的 R 包中使用函数?