簡體   English   中英

在 R 中使用 for 循環計算平均值

[英]Calculate the mean with a for loop in R

這就是我必須做的:使用 for 循環計算並存儲每輛自行車的平均單圈時間。 下面的代碼是我試圖解決它的方法。 它給了我關於一些意外大括號的錯誤,我不知道為什么。 我必須使用 for 循環(沒有 tidyverse 或任何其他包)。

racing <- data.frame(Bike=rep(c("A1", "A2", "A3"), times=4),
                     Lap=rep(c(1,2,3,4), each=3),
                     Time=c(71,70,67,73,72,66,68,74,69,68,68,70))
for(bike in racing){
  if([racing$Bike=="A1",]){
    time_mean <- mean(racing$Time)
  }
  else if([racing$Bike=="A2",]){
    time_mean1 <- mean(racing$Time)
  }
  else{
    time_mean2 <- mean(racing$Time)
  }
}
lap_mean <- c(time_mean, time_mean1, time_mean2)
    

Error: unexpected '}' in "    }"

這可以使用tapply函數在一行中變得更簡單:

> (lapmean<-tapply(racing$Time, racing$Bike, mean))
A1 A2 A3 
70 71 68 

更新:

我很清楚為什么我的帖子被否決了,因為它需要更少的輸入並且比這里發布的任何其他程序更有效(與性能最差的代碼相比效率高 22 倍)。 我運行了提交的所有其他代碼的執行時間,以下是按經過時間(以秒為單位)按最佳到最差執行順序排列的結果:

  1. My Code StatsStudent - 使用 tictoc 包的時間為 .01 秒
  2. 阿克倫(聚合) - 0.03
  3. 丹 - 0.07
  4. akrun (for 循環) - 0.11
  5. 鴨子 - 0.22

我們可以使用來自base R aggregate

aggregate(Time ~ Bike, data = racing, FUN = mean)

-輸出

#   Bike Time
#1   A1   70
#2   A2   71
#3   A3   68

或者使用for循環

unb <- unique(racing$Bike)
out <- c()
for(bike in unb) {
     out <- c(out, mean(subset(racing, Bike == bike, select = Time)$Time))
 }

setNames(out, unb)
#   A1 A2 A3  
# 70 71 68 

嘗試這個。 您可以創建一個向量來存儲自行車,然后使用subset()遍歷它來過濾數據並計算平均時間。 這里的代碼:

#Data
racing <- data.frame(Bike=rep(c("A1", "A2", "A3"), times=4),
                     Lap=rep(c(1,2,3,4), each=3),
                     Time=c(71,70,67,73,72,66,68,74,69,68,68,70),stringsAsFactors = F)
#Bikes
vb <- unique(racing$Bike)
#Loop
vmeans <- numeric(length(vb))
for(i in 1:length(vb))
{
  #Data
  x <- subset(racing,Bike==vb[i])
  #Mean
  vmeans[i] <- mean(x$Time)
}
names(vmeans) <- vb

輸出:

vmeans
A1 A2 A3 
70 71 68 

使用 base-R,我認為以下內容很有指導意義:

results <- data.frame("Bike"=NA, "MeanTime"=NA)

for(i in unique(racing$Bike)) {
  tmp <- filter(racing, Bike == i)
  print(tmp) ;  print(mean(tmp$Time))
  
  results[match(i, unique(racing$Bike)),] <- c(i, mean(tmp$Time))
}
  print(results)

這給出了以下內容:

>   print(results)
  Bike MeanTime
1   A1       70
2   A2       71
3   A3       68

在打印循環正在做什么的基礎上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM