如何使用Apply Function

时间:2016-05-02 09:20:06

标签: r for-loop apply

我有这个脚本:

    library(plyr)
    library(gstat)
    library(sp) 
    library(dplyr)
    library(ggplot2)
    library(scales)
    a<-c(10,20,30,40,50,60,70,80,90,100)
    b<-c(15,25,35,45,55,65,75,85,95,105)
    x<-rep(a,3)
    y<-rep(b,3)
    E<-sample(30)
    freq<-rep(c(100,200,300),10)

    data<-data.frame(x,y,freq,E)
    data<-arrange(data,x,y,freq)

df <- ddply(data,"freq", function (h){
  dim_h<-length(h$x)
  perc_max <- 0.9
  perc_min <- 0.8
  u<-round((seq(perc_max,perc_min,by=-0.1))*dim_h)
  dim_u<-length(u)

  perc_punti<- percent(seq(perc_max,perc_min,by=-0.1))
  for (i in 1:dim_u)
  {  t<-u[i]
  time[i]<-system.time(
    for (j in 1:2)
    {  

      df_tass <- sample_n(h, t)

      df_residuo <- slice(h,-as.numeric(rownames(df_tass)))

      coordinates(df_tass)= ~x + y

      x.range <- range(h$x)  
      y.range <- range(h$y)
      grid <- expand.grid(x = seq(from = x.range[1], to = x.range[2], by = 1), y = seq(from = y.range[1], 
                                                                                       to = y.range[2], by = 1))
      coordinates(grid) <- ~x + y
      gridded(grid) <- TRUE

      nearest = krige(E ~ 1, df_tass, grid, nmax = 1)

      nearest_df<-as.data.frame(nearest)
      names(nearest_df) <- c("x", "y", "E")
      #Error of prediction
      df_pred <- inner_join(nearest_df[1:3],select(df_residuo,x,y,E),by=c("x","y")) 
      names(df_pred) <- c("x", "y", "E_pred","E")
      sqm[j] <- mean((df_pred[,4]-df_pred[,3])^2)
    })[3]
  sqmm[i]<-mean(sqm)
  }
  df_finale<-data.frame(sqmm,time,perc_punti)
})
df

我在几个坐标点(x,y)处测量了不同频率(频率值)下的电磁场值(E值)。对于每个频率值,我使用90%的点和80%(使用带有l的for循环)使用最近邻插值grid内插krige内的电磁场(E)的值。功能);我重复这两次。然后,剩余的点将用于计算预测误差。我希望它很清楚。

上面的这个脚本是一个简化的案例。不幸的是,在我的情况下,脚本需要太长时间才能实现两个for循环。 我想询问是否可以通过某种方式简化代码,例如使用apply函数系列。感谢。

回复 @clemlaflemme确定它有效!谢谢......现在我对最终的数据帧有一些问题,它看起来像这样:

  freq      1      2
1  100 121.00 338.00
2  100   0.47   0.85
3  200  81.00 462.50
4  200   0.74   0.73
5  300  36.00 234.00
6  300   0.82   0.76

但我想要这样的事情:

  freq  sqmm time
1  100 121.0 0.47
2  100 338.0 0.85
3  200  81.0 0.74
4  200 462.5 0.73
5  300  36.0 0.82
6  300 234.0 0.76

我该怎么办?

0 个答案:

没有答案
相关问题