移除异常值后计算剩余数据占比时输出numeric(0)的问题排查
问题原因及解决办法
你代码最后一行输出numeric(0)的核心问题是:dep_delay是从数据框里提取的向量,而nrow()是用来计算数据框/矩阵行数的函数,对向量调用nrow()会返回NULL,用NULL做减法和除法自然得不到有效结果。
修正方案一:替换nrow()为合适的向量长度计算
因为你用了na.rm=TRUE计算分位数,所以应该统计非NA值的总数,而不是向量的总长度(总长度包含NA)。把最后一行的nrow(dep_delay)换成sum(!is.na(dep_delay))即可:
dep_delay <- flights$dep_delay dep_delay_upper <- quantile(dep_delay, 0.997, na.rm=TRUE) dep_delay_lower <- quantile(dep_delay, 0.003, na.rm=TRUE) dep_delay_out <- which(dep_delay > dep_delay_upper | dep_delay < dep_delay_lower) # 替换nrow为sum(!is.na(...))统计有效数据量 (sum(!is.na(dep_delay)) - length(dep_delay_out)) / sum(!is.na(dep_delay)) * 100
修正方案二:更简洁的写法(不用which)
直接用逻辑向量计算保留的数据占比,步骤更清晰:
dep_delay <- flights$dep_delay # 计算分位数 q <- quantile(dep_delay, c(0.003, 0.997), na.rm=TRUE) # 生成逻辑向量:TRUE表示保留的数据(非异常值且非NA) keep <- dep_delay >= q[1] & dep_delay <= q[2] & !is.na(dep_delay) # 计算占比 mean(keep) * 100
这里mean(keep)会自动计算TRUE的比例,乘以100就是百分比,比用which更高效。
内容的提问来源于stack exchange,提问作者jakdar
相关产品推荐
相关产品推荐

