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

如何高效计算DataFrame指定列的行非缺失值计数?

高效计算指定列每行非缺失值数量的方法

你当前使用的rowwise()方法会逐行循环处理数据,在数据集较大时效率极低。可以通过向量化操作替代逐行循环,大幅提升运行速度,以下是两种最优方案:

方案一:Tidyverse 原生优化(推荐)

直接使用rowSums()结合across(),无需rowwise(),利用向量化求和实现高效计算:

data %>%
  select(
    Rftrialnum,
    Rfdaterando,
    OID1treatmentcycle,
    OID2treatmentcycle,
    OID3treatmentcycle,
    OID4treatmentcycle,
    OID5treatmentcycle,
    OID6treatmentcycle,
    Eoipptpreg,
    Eoicompletedoi
  ) %>%
  mutate(
    count_cycle = rowSums(!is.na(across(ends_with("treatmentcycle"))))
  )

原理说明

rowSums()是R内置的向量化函数,会一次性对所有行进行求和计算,避免了rowwise()的逐行循环开销,在数千行数据上的运行速度会比原方法快一个数量级以上。

方案二:Data.table 极致优化(超大数据集适用)

如果你的数据集规模极大(比如百万行级别),可以使用data.table包,它的内存效率和运行速度比tidyverse更优:

library(data.table)
# 转换为data.table格式
setDT(data)
# 计算非缺失值数量,同时保留指定列
data[, count_cycle := rowSums(!is.na(.SD)), .SDcols = ends_with("treatmentcycle")][
  , .(Rftrialnum, Rfdaterando, OID1treatmentcycle, OID2treatmentcycle, OID3treatmentcycle, OID4treatmentcycle, OID5treatmentcycle, OID6treatmentcycle, Eoipptpreg, Eoicompletedoi, count_cycle)]

原理说明

data.table采用基于引用的修改方式,避免了不必要的数据复制,同时.SDcols可以精准指定需要处理的列,进一步提升效率。

内容的提问来源于stack exchange,提问作者jackahall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:12:26