如何定义可在R语言apply()中使用的函数以高效提取指定列值?
高效提取每行指定列的值(替代慢循环的方案)
处理1000万行数据时,for循环慢是因为R的循环本身开销大,而向量化操作才是R处理大规模数据的正确姿势,比apply系列还要高效得多。
最优方案:直接向量化索引
不需要用apply,直接用行列向量组合的索引就能一次性提取所有值:
# 生成每行对应的(行号, 目标列号)矩阵,直接索引 value <- data[cbind(seq_len(nrow(data)), data[, 300])]
这个操作是完全向量化的,底层用C实现,处理1000万行数据的速度会比循环快几十甚至上百倍。
如果你一定要用apply的方案(不推荐大规模数据)
如果坚持要用apply,可以定义逐行处理的函数,但要注意这个方法在1000万行下依然会很慢——因为apply本质还是逐行循环:
value <- apply(data, 1, function(row) { row[row[300]] })
额外优化建议
如果你的data是数据框,先转成矩阵再操作会更快:
data_mat <- as.matrix(data) value <- data_mat[cbind(seq_len(nrow(data_mat)), data_mat[, 300])]
内容的提问来源于stack exchange,提问作者Matilda Johnson
相关产品推荐
相关产品推荐

