r - 提高 R 中循环的效率
问题描述
我一直在研究 R 中的代码,用于计算我的数据的标准偏差 (SD)。我将它作为一个循环来完成,它查看第一行和第二行,计算该行中每一列的 SD,然后总计 SD。然后它重复下一次查看第 1、2 和 3 行,然后是第 1 到 4 行等。
它在包含 19 行和 128 列的测试数据集上运行良好,但我的实际数据集大约有 340,000 行和 128 列。当我运行此代码时,它无法到达终点,在大约 100,000 标记处减速,我想从我添加打印功能来显示它在哪个循环上。
这是代码:
site <- read.csv("data.csv", header = TRUE)
SDCalculate <- function(data){
sd_totals <- data.frame(SD=0)
for(i in 2:nrow(data)){
sd_values <- data.frame()
cat(i,"\n")
for (j in 4:ncol(data)){
list <- c(data[1:i,j])
sd_values <- rbind(sd_values, sd(list))
}
sd_totals <-rbind(sd_totals, sum(sd_values))
}
data <- sd_totals
}
results<- SDCalculate(site)
我想知道是否有任何方法可以提高代码的效率以使其正常工作?还是值得在 Python 中运行它?任何帮助将不胜感激!
解决方案
如所写, SDCalculate 不返回任何结果,最后一行应该是data
or sd_totals
。如果您有 340000 行和 128 列,则内部循环将执行超过 43 万次。第一个循环选择一个添加下一行的数据矩阵,然后为您sd
按列计算的新矩阵,然后使用 rbind 构建一个单列矩阵,但随后您得到 sd 的总和。那么为什么不只是在循环中对 sd 求和。
SDCalculate2 <- function(data){
SD <- 0 # do not need data.frame(SD=0)
for(i in 2:nrow(data)){
sd_sum <- 0 # do not need a data frame sd_values
for (j in 4:ncol(data)){
sd_sum <- sd_sum + sd(data[1:i,j])
}
# do not need rbind
SD[i] <- sd_sum
}
# output
as.data.frame(SD)
}
另一种选择,我没有尝试性能,没有内循环
SDCalculate3 <- function(data){
SD <- 0
for(i in 2:nrow(data)){
SD[i] <- sum(apply(data[1:i,4:ncol(data)],2,sd))
}
data.frame(SD)
}
推荐阅读
- java - 有人可以给我一个关于如何为一组名称实现图表的例子吗?
- regex - 正则表达式“所有不包含此字符串的内容”
- java - 如何在 Spring Boot 独立应用程序中激活 JMX 监控
- python - 如何整齐地格式化输出?
- java - 每当我添加 OnClickListener 或 Fragment 时,我的应用程序就会崩溃,这是我的 OnClickListener 代码
- javascript - 构建我的应用程序并安装 Google Maps API 后,每当我倾向于搜索位置时,我的应用程序就会崩溃
- jenkins - 詹金斯错误 com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; 客户端未通过身份验证
- php - 如何在刀片模板中使用带有日期的“If else”条件
- python - 使用 Beautifulsoup 查找版权字符
- css - Element::after - 叠加