如何在R语言计算月度平均值时排除无效0值?
解决方法:排除0值计算月度均值并优化代码
1. 直接在均值计算中过滤0值
不用把0转成NA,你可以在mean()函数里直接筛选掉0值,只对非0的数值计算均值。如果数据本身存在NA,记得加上na.rm = TRUE避免计算出错:
核心计算逻辑修改如下:
mean(c(D01, D02, ..., D31)[c(D01, D02, ..., D31) != 0], na.rm = TRUE)
2. 优化列选择,避免手动输入70个列
由于你有大量每日列(70个),手动逐个输入列名效率极低,推荐用c_across()结合列选择器批量选取目标列——比如用starts_with("D")匹配所有以D开头的列,或者matches("^D\\d+$")精准匹配「D+数字」格式的列:
完整优化后的代码:
DF <- DF %>% rowwise() %>% mutate(monthly_Average = mean(c_across(starts_with("D"))[c_across(starts_with("D")) != 0], na.rm = TRUE))
额外处理:全0行的情况
如果某一行所有值都是0,上面的代码会返回NaN,你可以根据业务需求用ifelse处理这种情况,比如替换为0或者NA:
DF <- DF %>% rowwise() %>% mutate(monthly_Average = { daily_vals <- c_across(starts_with("D")) non_zero_vals <- daily_vals[daily_vals != 0] if (length(non_zero_vals) == 0) 0 else mean(non_zero_vals, na.rm = TRUE) })
内容的提问来源于stack exchange,提问作者Nerea
相关产品推荐
相关产品推荐

