如何高效计算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
相关产品推荐
相关产品推荐

