如何在R中以有效方式计算循环中3个后续点的平均值
How to calculate the mean value of the 3 subsequent points on a loop on an effective way in R
我正在尝试使用通式计算磷酸盐通量:
F= -krho2 * d(P2-P1)/d(z2-z1) - krho1 * d(P1-P0)/d(z1-z0) 写为:
Flu_1[i] <- -df44$krho[i+1]*(df4$Phosphate[i+1]-df4$Phosphate[i])/(df44$Depth[i+1]-df44$Depth[i]) - df44$krho[i]*(df44$Phosphate[i]-df4$Phosphate[i-1])/(df44$Depth[i]-df44$Depth[i-1])
但是我在应用该公式时遇到了一些麻烦,因为它变得非常冗长,因为我需要在每一步中计算 3 个点的平均值。我想知道是否有一种方法可以更优雅地计算三个点的平均值。问题是公式太长了,我倾向于用 () 括号做错误。
所以我现在得到了一个非常冗长的公式来计算 Flu_1 给定的 df44
Depth <- c(99.92047 ,100.42265 ,100.94351 ,101.49154 ,101.49154, 102.06895, 102.65300, 103.22167, 103.78107, 104.34240,104.90919, 105.48243, 106.06067, 106.64186 ,107.22266, 107.79475, 108.35091, 108.89342,109.42737,109.95948,110.49694 ,111.04430 ,111.59580, 112.14390,112.68424, 113.21562,113.74625, 114.28672 ,114.84307, 115.40328,115.95459, 116.49954, 117.04479, 117.59821,118.16798,118.75777, 119.35323 ,119.93831 ,120.50840, 121.06288,121.60563 ,122.13841, 122.64992, 123.12560 ,123.55157,123.91674 ,124.21265 ,124.43866 ,124.59617 ,124.68674,124.71200, 124.68063, 124.62943 ,124.60175, 124.63884 ,124.77147, 124.99055 ,125.27705, 125.60735,125.93964,126.23798 ,126.50830 ,126.76194 ,126.99021 ,127.17937 ,127.31813 ,127.40495, 127.44802 ,127.48466, 127.55065,127.64658 ,127.76420)
Krho <- c( -5.286844, -5.286844 ,-5.072112 ,-5.072112 ,-5.016449 ,-5.016449, -4.840471,-4.840471, -4.840471, -4.969141,-4.969141, -4.969141 ,-4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141,-4.969141, -4.969141,-4.969141, -4.969141, -4.969141 ,-4.969141 ,-4.969141 ,-4.969141, -4.969141, -4.969141,-4.969141, -4.969141, -4.969141,-4.969141, -4.969141, -4.969141, -4.969141 ,-4.969141, -4.969141, -4.969141,-4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141,-4.969141, -4.969141 ,-4.969141 ,-4.969141 ,-4.969141 ,-4.969141 ,-4.969141, -4.969141,-4.969141 ,-4.969141,-4.969141, -4.969141, -4.969141, -4.969141 ,-4.969141 ,-4.969141, -4.969141,-4.969141,-4.969141,-4.969141,-4.969141 ,-4.969141)
Phosphate <- c(1.2775859, 1.2494627 ,1.2162273 ,1.1791951 ,1.1791951, 1.1398022 ,1.0999701, 1.0615126,1.0253303,0.9920223,0.9618954,0.9352211,0.9124229,0.8939618,0.8801429,0.8706457,0.8648398,0.8614785,0.8592499,0.8571969,0.8544512,0.8503440,0.8450059,0.8389027,0.8330438,0.8283908,
0.8251727, 0.8234350, 0.8230596, 0.8232740,0.8232948, 0.8229505, 0.8221870, 0.8208087, 0.8185845,0.8152875,0.8107066,0.8047596,0.7978633,0.7905728,0.7834964,0.7772102,0.7721074,0.768, 0.7667334, 0.7665123, 0.7674906, 0.7689529, 0.7702238 ,0.7711219,
0.7715893, 0.7716646 ,0.7717726, 0.7723444 ,0.7734504, 0.7749810, 0.7764664,0.7773463,0.7771001, 0.7753641,0.7719523, 0.7672308, 0.7616953, 0.7558070, 0.7500182, 0.7447203, 0.7400592, 0.7361163,0.7329601, 0.7306044,0.7288592, 0.7274832)
df44 <- data.frame(Depth,Krho,Phosphate)
du44<- as.data.frame(matrix( 0, nrow(df44), ncol= 2))
names(du44) <- c("Depth","Flux_PO4")
Flu_1 <- 0)
du44[1,1]<- df44$Depth[1]
du44[1,2]<- Flu_1
for(i in 2:nrow(df44)) {
Flu_1[i] <- -df44$krho[i+2]*(mean(df44$Phosphate[i+2]+df44$Phosphate[i+3]+df44$Phosphate[i+4])-mean(df44$Phosphate[i+1]+df44$Phosphate[i+2]+df44$Phosphate[i+3]))/
(mean(df44$Depth[i+2]+df44$Depth[i+3]+df44$Depth[i+4])-mean(df44$Depth[i+1]+df44$Depth[i+2]+df44$Depth[i+3]))-(df44$krho[i+1]*(mean(df44$Phosphate[i]+df44$Phosphate[i+1]+df44$Phosphate[i+2])- mean(df44$Phosphate[i-1]+df44$Phosphate[i]+df44$Phosphate[i+1]))/(mean(df44$Depth[i+1]+df44$Depth[i+2]+df44$Depth[i+3])-mean(df44$Depth[i-1]+df44$Depth[i]+df44$Depth[i+1])))
du44[i,1]<- df44$Depth[i]
du44[i,2]<- Flu_1[i]
}
非常感谢!
您可以使用lead
和lag
分别获取下一个和上一个值来执行计算。
library(dplyr)
df44 %>%
mutate(Flu_1 = -lead(Krho)*(lead(Phosphate)-Phosphate)/(lead(Depth)-Depth) -
Krho*(Phosphate-lag(Phosphate))/(Depth-lag(Depth))) -> df44
df44
我正在尝试使用通式计算磷酸盐通量:
F= -krho2 * d(P2-P1)/d(z2-z1) - krho1 * d(P1-P0)/d(z1-z0) 写为:
Flu_1[i] <- -df44$krho[i+1]*(df4$Phosphate[i+1]-df4$Phosphate[i])/(df44$Depth[i+1]-df44$Depth[i]) - df44$krho[i]*(df44$Phosphate[i]-df4$Phosphate[i-1])/(df44$Depth[i]-df44$Depth[i-1])
但是我在应用该公式时遇到了一些麻烦,因为它变得非常冗长,因为我需要在每一步中计算 3 个点的平均值。我想知道是否有一种方法可以更优雅地计算三个点的平均值。问题是公式太长了,我倾向于用 () 括号做错误。
所以我现在得到了一个非常冗长的公式来计算 Flu_1 给定的 df44
Depth <- c(99.92047 ,100.42265 ,100.94351 ,101.49154 ,101.49154, 102.06895, 102.65300, 103.22167, 103.78107, 104.34240,104.90919, 105.48243, 106.06067, 106.64186 ,107.22266, 107.79475, 108.35091, 108.89342,109.42737,109.95948,110.49694 ,111.04430 ,111.59580, 112.14390,112.68424, 113.21562,113.74625, 114.28672 ,114.84307, 115.40328,115.95459, 116.49954, 117.04479, 117.59821,118.16798,118.75777, 119.35323 ,119.93831 ,120.50840, 121.06288,121.60563 ,122.13841, 122.64992, 123.12560 ,123.55157,123.91674 ,124.21265 ,124.43866 ,124.59617 ,124.68674,124.71200, 124.68063, 124.62943 ,124.60175, 124.63884 ,124.77147, 124.99055 ,125.27705, 125.60735,125.93964,126.23798 ,126.50830 ,126.76194 ,126.99021 ,127.17937 ,127.31813 ,127.40495, 127.44802 ,127.48466, 127.55065,127.64658 ,127.76420)
Krho <- c( -5.286844, -5.286844 ,-5.072112 ,-5.072112 ,-5.016449 ,-5.016449, -4.840471,-4.840471, -4.840471, -4.969141,-4.969141, -4.969141 ,-4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141,-4.969141, -4.969141,-4.969141, -4.969141, -4.969141 ,-4.969141 ,-4.969141 ,-4.969141, -4.969141, -4.969141,-4.969141, -4.969141, -4.969141,-4.969141, -4.969141, -4.969141, -4.969141 ,-4.969141, -4.969141, -4.969141,-4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141, -4.969141,-4.969141, -4.969141 ,-4.969141 ,-4.969141 ,-4.969141 ,-4.969141 ,-4.969141, -4.969141,-4.969141 ,-4.969141,-4.969141, -4.969141, -4.969141, -4.969141 ,-4.969141 ,-4.969141, -4.969141,-4.969141,-4.969141,-4.969141,-4.969141 ,-4.969141)
Phosphate <- c(1.2775859, 1.2494627 ,1.2162273 ,1.1791951 ,1.1791951, 1.1398022 ,1.0999701, 1.0615126,1.0253303,0.9920223,0.9618954,0.9352211,0.9124229,0.8939618,0.8801429,0.8706457,0.8648398,0.8614785,0.8592499,0.8571969,0.8544512,0.8503440,0.8450059,0.8389027,0.8330438,0.8283908,
0.8251727, 0.8234350, 0.8230596, 0.8232740,0.8232948, 0.8229505, 0.8221870, 0.8208087, 0.8185845,0.8152875,0.8107066,0.8047596,0.7978633,0.7905728,0.7834964,0.7772102,0.7721074,0.768, 0.7667334, 0.7665123, 0.7674906, 0.7689529, 0.7702238 ,0.7711219,
0.7715893, 0.7716646 ,0.7717726, 0.7723444 ,0.7734504, 0.7749810, 0.7764664,0.7773463,0.7771001, 0.7753641,0.7719523, 0.7672308, 0.7616953, 0.7558070, 0.7500182, 0.7447203, 0.7400592, 0.7361163,0.7329601, 0.7306044,0.7288592, 0.7274832)
df44 <- data.frame(Depth,Krho,Phosphate)
du44<- as.data.frame(matrix( 0, nrow(df44), ncol= 2))
names(du44) <- c("Depth","Flux_PO4")
Flu_1 <- 0)
du44[1,1]<- df44$Depth[1]
du44[1,2]<- Flu_1
for(i in 2:nrow(df44)) {
Flu_1[i] <- -df44$krho[i+2]*(mean(df44$Phosphate[i+2]+df44$Phosphate[i+3]+df44$Phosphate[i+4])-mean(df44$Phosphate[i+1]+df44$Phosphate[i+2]+df44$Phosphate[i+3]))/
(mean(df44$Depth[i+2]+df44$Depth[i+3]+df44$Depth[i+4])-mean(df44$Depth[i+1]+df44$Depth[i+2]+df44$Depth[i+3]))-(df44$krho[i+1]*(mean(df44$Phosphate[i]+df44$Phosphate[i+1]+df44$Phosphate[i+2])- mean(df44$Phosphate[i-1]+df44$Phosphate[i]+df44$Phosphate[i+1]))/(mean(df44$Depth[i+1]+df44$Depth[i+2]+df44$Depth[i+3])-mean(df44$Depth[i-1]+df44$Depth[i]+df44$Depth[i+1])))
du44[i,1]<- df44$Depth[i]
du44[i,2]<- Flu_1[i]
}
非常感谢!
您可以使用lead
和lag
分别获取下一个和上一个值来执行计算。
library(dplyr)
df44 %>%
mutate(Flu_1 = -lead(Krho)*(lead(Phosphate)-Phosphate)/(lead(Depth)-Depth) -
Krho*(Phosphate-lag(Phosphate))/(Depth-lag(Depth))) -> df44
df44