R语言中时间序列栅格逐像素去除异常值的问题求助
栅格时间序列行异常值替换方案
报错原因
rowwise模式下误用across()提取当前行数值,应使用c_across()获取当前行的指定列向量- 直接将NA值代入
if判断的比较逻辑,NA > 任意数值的返回结果仍为NA,if无法解析非逻辑值输入,触发报错
dplyr语法直接修复版
先单独计算每行的75分位数,再批量替换大于阈值的数值为NA,逻辑清晰易读:
my_data %>% rowwise() %>% # 计算当前行所有数值列的75分位数 mutate(row_q75 = quantile(c_across(is.numeric), 0.75, na.rm = TRUE)) %>% # 批量替换所有数值列中大于分位数的值为NA mutate(across(is.numeric, ~ case_when( . > row_q75 ~ NA_real_, TRUE ~ . ))) %>% # 移除临时分位数列,不需要可删除本行 select(-row_q75)
该方案保留了dplyr的语法风格,适合中小数据量场景使用。
栅格大数据最优实现方案
栅格数据通常有数十万到数百万行像素,rowwise逐行运算效率极低,推荐使用matrixStats包的向量化运算,速度可提升数十倍:
library(dplyr) library(matrixStats) # 提取所有数值列转为矩阵 num_mat <- my_data %>% select(is.numeric) %>% as.matrix() # 批量计算所有行的75分位数 row_q75 <- rowQuantiles(num_mat, probs = 0.75, na.rm = TRUE) # 矩阵批量替换大于阈值的数值为NA num_mat[num_mat > row_q75] <- NA # 将修改后的数值列替换回原数据框 my_data[colnames(num_mat)] <- num_mat
该方案天然适配全NA行的边界情况,不会额外触发报错。
内容的提问来源于stack exchange,提问作者ppoudel
相关产品推荐
相关产品推荐

