在R中按行计算连续NA序列长度的最小值、最大值与均值
按行统计连续NA的长度统计量解决方案
嘿,我来帮你搞定这个在R里按行计算连续NA长度的最小值、最大值和均值的需求!
首先,先确认你的数据框创建是正确的,先把代码写出来:
b <- as.data.frame(matrix(ncol=7, nrow=3, c(3,NA,NA,4,5,NA,7,6,NA,7,NA,8,9,NA,NA,4,6,NA,NA,7,NA), byrow = TRUE))
接下来,我们可以写一个自定义函数,用来处理单行数据,提取连续NA的长度并计算对应的统计量:
get_na_stats <- function(row_data) { # 用rle函数检测连续的元素,返回长度和值的列表 na_rle <- rle(is.na(row_data)) # 提取所有连续NA的长度 na_lengths <- na_rle$lengths[na_rle$values] # 如果没有NA,返回NA(或者根据需求调整为0等) if (length(na_lengths) == 0) { return(c(max = NA, min = NA, mean = NA)) } # 计算统计量 max_len <- max(na_lengths) min_len <- min(na_lengths) mean_len <- mean(na_lengths) return(c(max = max_len, min = min_len, mean = mean_len)) }
然后,用apply函数按行应用这个函数,得到每行的统计结果,再把结果合并到原数据框中:
# 按行应用函数,得到统计量矩阵 na_stats <- t(apply(b, 1, get_na_stats)) # 转换为数据框,方便合并 na_stats_df <- as.data.frame(na_stats) # 合并原数据框和统计量数据框 result <- cbind(b, na_stats_df) # 可以把mean列保留两位小数,和你的预期结果一致 result$mean <- round(result$mean, 2)
现在查看最终结果:
print(result)
输出会是:
V1 V2 V3 V4 V5 V6 V7 max min mean 1 3 NA NA 4 5 NA 7 2 1 1.50 2 6 NA 7 NA 8 9 NA 1 1 1.00 3 NA 4 6 NA NA 7 NA 2 1 1.33
完全符合你预期的结果!
关键步骤解释
rle(is.na(row_data)):is.na把每行数据转为布尔值(NA为TRUE,非NA为FALSE),rle函数会识别连续的相同值,返回连续长度和对应的值,这样我们就能提取出所有连续NA的长度。apply(b, 1, get_na_stats):按行(第二个参数为1)处理数据框b的每一行,应用自定义函数。t()转置结果:因为apply返回的是列对应行的结果,转置后才能和原数据框的行一一对应。
内容的提问来源于stack exchange,提问作者ACLAN
相关产品推荐
相关产品推荐

