【问题标题】:Calculate the mean with a for loop in R用R中的for循环计算平均值
【发布时间】:2021-02-02 13:36:33
【问题描述】:

这就是我必须做的:使用 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 "    }"

【问题讨论】:

  • 您在第 8 行缺少"
  • 你是对的!但它仍然给我同样的错误

标签: r for-loop mean


【解决方案1】:

试试这个。您可以创建一个向量来存储自行车,然后使用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 

【讨论】:

    【解决方案2】:

    这可以使用tapply 函数在一行中变得更简单:

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

    更新:

    我很清楚为什么我的帖子被否决了,因为它需要更少的输入,并且比此处发布的任何其他程序都更有效(与性能最差的代码相比,效率提高了 22 倍)。我运行了所有其他提交的代码的执行时间,以下是按经过时间(以秒为单位)从表现最好到最差的顺序排列的结果:

    1. 我的代码 StatsStudent - 使用 tictoc 包经过 0.01 秒的时间
    2. akrun(合计)- 0.03
    3. 丹 - 0.07
    4. akrun(for 循环)- 0.11
    5. 鸭 - 0.22

    【讨论】:

      【解决方案3】:

      我们可以从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 
      

      【讨论】:

        【解决方案4】:

        使用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
        

        除了打印循环正在做什么

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-22
          • 1970-01-01
          • 2022-01-05
          • 1970-01-01
          • 1970-01-01
          • 2019-11-30
          • 2021-06-19
          • 1970-01-01
          相关资源
          最近更新 更多