在时序数据库中,如何简洁实现DataFrame每行除以变量平方和?
嘿,这个问题我太懂了!你现在写的循环确实有点绕,尤其是那个as.numeric %>% t %>% c的操作完全没必要,其实R里有非常简洁的向量化方法,不仅代码更清爽,运行效率也比循环高不少,毕竟R天生就擅长向量运算嘛~
首先,先明确你的需求:把DataFrame的每一行的每个元素,除以该行所有元素的平方和,对吧?那可以用这两种简洁的方法:
方法1:用sweep()函数(最推荐,可读性拉满)
sweep()就是专门用来按行/列对数据框做批量运算的工具,一行就能搞定:
base_normalized <- sweep(base, 1, rowSums(base^2), `/`)
解释一下:
base是你的原始数据框1表示按行操作(如果是2就是按列)rowSums(base^2):直接计算每行的平方和,这比你用矩阵乘法的方式简洁太多了/表示执行除法操作
方法2:矩阵广播(更紧凑的写法)
如果你习惯用矩阵操作,也可以把数据框转成矩阵后利用广播特性:
base_mat <- as.matrix(base) base_normalized <- base_mat / rowSums(base_mat^2)
这里R会自动把rowSums得到的向量广播成和矩阵同维度的列矩阵,完成逐行除法,结果如果需要转回数据框的话,加个as.data.frame(base_normalized)就行。
顺便优化下你原来的循环写法(如果非要用循环的话)
就算坚持用循环,也不用搞那么复杂的矩阵操作,直接用sum()计算平方和就行:
for(i in 1:nrow(base)){ base[i,] <- base[i,] / sum(base[i,]^2) }
毕竟sum(x^2)和t(x) %*% x的结果是完全一样的,但前者明显更直观。
总的来说,优先用向量化的方法,不仅代码短,大数据量下的运行速度会比循环快很多哦~
内容的提问来源于stack exchange,提问作者theBotelho
相关产品推荐
相关产品推荐

