You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:01