如何重复计算数据库的子集

时间:2014-01-16 10:14:44

标签: r function apply lapply

我有一个大型数据框,有许多横断面,对于每个横断面,我想计算每年截距(x)和值(y)。然后我想知道截距在不同年份如何变化。我知道如何计算截距,但是我有很多横断面,我必须重复这一点,我想更自动地做到这一点。

这就是我的数据的样子:

DF

   transects year cros value
    10    1996   11    -3
    10    1996   12     5
    10    2005   11    -9
    10    2005   12    -3
    10    2010   11    -8
    10    2010   12    -8
    11    1996   11     7
    11    1996   12    -4
    11    2005   11    -6
    11    2005   12     9
    11    2010   11     6
    11    2010   12    17
    12    1996   14   -16
    12    1996   15   -17
    12    2005   14   -18
    12    2005   15   -11
    12    2010   14    16
    12    2010   15     7

所以我做了一个函数,对数据集进行子集化并用这个子集做一些计算。

这是代码。我使用lapply因为我希望代码的结果放在list中。但是,lapply可能不是解决此问题的正确功能。

 transect <- c(10, 11, 12)  

o <- lapply(1:length(transect), function(i) {
        s101 <- subset(df, along == transect[[i+1]])

#我想为每个横断面创建一个子集,并且我希望对该子集进行多次计算。

#Dune音量

#这确保我有一个拦截,如果没有超过3

的值
AUC96<-0 
 AUC05<-0
 AUC10<-0

 # Here I calculate the intercept for the different years.

     d96 <- subset(s101, (cros >= 3.00) & (year == 1996))
     AUC96<-sintegral(d96$cros,d96$value)$int
     lengthdune96 <- max(d96$value)-min(d96$value)
     AUC962 <- lengthdune96*8.00
     AUC96 <- AUC96 +AUC962

     d05 <- subset(s101, (cros >= 3.00) & (year == 2005))
     AUC05<-sintegral(d05$cros,d05$value)$int
     lengthdune05 <- max(d05$alti)-min(d05$value)
     AUC052 <- lengthdune05*8.00
     AUC05 <- AUC05 +AUC052

     d10 <- subset(s101, (cros >= 3.00) & (year == 2010))
     AUC10<-sintegral(d10$cros,d10$value)$int
     lengthdune10 <- max(d05$value)-min(d05$value)
     AUC102 <- lengthdune10*8.00
     AUC10 <- AUC10 +AUC102

     # Here the difference between the years
     dune96.05 <- AUC05-AUC96
     dune05.10 <- AUC10-AUC05

  c(transect[[i+1]], dune96.05, dune05.10)                              
   })
   out <- as.data.frame(do.call(rbind, o))

然而,当我尝试这个时,我得到错误

`Error in approx(x, fx, n = 2 * n.pts + 1) :
      need at least two non-NA values to interpolate`

这是我第一次尝试制作这样的功能,所以可能是我完全错了。我希望你能帮助我。

编辑:

所以在我改变了答案之后,因为那并没有完全解决。但是我仍然收到错误消息,我真的被卡住了。我也尝试了不同的方法来解决这个问题,例如查看plyr包,但是我仍然会遇到相同的错误问题:

这就是我的代码的样子:

test<-lapply(unique(df$transect),function(i){s101 <- subset(df,df$transect==i)
{

  AUC96<-0
  AUC05<-0
  AUC10<-0

 d96 <- subset(s101, (cros >= 3.00) & (year == 1996))
 AUC96<-sintegral(d96$cros,d96$value)$int
 lengthdune96 <- max(d96$value)-min(d96$value)
 AUC962 <- lengthdune96*8.00
 AUC96 <- AUC96 +AUC962

 d05 <- subset(s101, (cros >= 3.00) & (year == 2005))
 AUC05<-sintegral(d05$cros,d05$value)$int
 lengthdune05 <- max(d05$alti)-min(d05$value)
 AUC052 <- lengthdune05*8.00
 AUC05 <- AUC05 +AUC052

 d10 <- subset(s101, (cros >= 3.00) & (year == 2010))
 AUC10<-sintegral(d10$cros,d10$value)$int
 lengthdune10 <- max(d05$value)-min(d05$value)
 AUC102 <- lengthdune10*8.00
 AUC10 <- AUC10 +AUC102

 dune96.05 <- AUC05-AUC96
 dune05.10 <- AUC10-AUC05

}

c(i,dune96.05, dune05.10)    
})

但是我仍然收到此错误消息:

`Error in approx(x, fx, n = 2 * n.pts + 1) :
  need at least two non-NA values to interpolate` 

我不确定我做错了什么,功能应该像这样工作。我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

我看到你使用lapply有两个问题。您将 transect 编入索引(它是一个向量)并且不将它(也不是df)作为参数传递给lapply中的函数,因此对子集没有好运。尝试这样的事情:

lapply(unique(df$transect),function(i,df){s101 <- subset(df,transect==i)
,...
c(i, dune96.05, dune05.10)     
},df)