我有一个大型数据框,有许多横断面,对于每个横断面,我想计算每年截距(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`
我不确定我做错了什么,功能应该像这样工作。我希望有人可以帮助我。
答案 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)