如何用apply/lapply函数批量计算多列数据的95分位数?
解决批量计算多列95分位数的问题
你的代码有两个关键问题导致结果和单独计算不一致:
- 索引方式错误:
data[v]返回的是单列数据框,而data$item1是向量,虽然quantile能处理数据框,但更稳妥且和单独计算逻辑一致的是用data[[v]]直接提取向量。 - 参数拼写错误:
digites应该是digits,写错后该参数会被忽略,可能导致精度差异。
修正后的批量计算代码
如果你想用索引遍历列,修改后的代码如下:
quantile_list <- lapply(1:50, function(v) { quantile(data[[v]], probs = 0.95, na.rm = TRUE, names = FALSE, type = 9, digits = 2) })
更简洁的方式是直接遍历数据框的列,不需要手动写索引:
# 用lapply得到列表结果 quantile_list <- lapply(data, function(col) { quantile(col, probs = 0.95, na.rm = TRUE, names = FALSE, type = 9, digits = 2) }) # 用sapply得到向量结果(更方便后续处理) quantile_vec <- sapply(data, function(col) { quantile(col, probs = 0.95, na.rm = TRUE, names = FALSE, type = 9, digits = 2) })
批量替换异常值的扩展
既然你要替换异常值,这里提供批量将每列中大于95分位数的值替换为95分位数的代码:
data_cleaned <- data.frame(lapply(data, function(col) { q95 <- quantile(col, probs = 0.95, na.rm = TRUE, type = 9) ifelse(col > q95, q95, col) })) # 恢复原列名 names(data_cleaned) <- names(data)
内容的提问来源于stack exchange,提问作者user21531215
相关产品推荐
相关产品推荐

