如何使用 R 中选定的单元格计算值

How to calculate value using selected cells in R

我正在尝试根据给定地点 40 公里半径内的预计温度计算选定地点的反距离加权温度值。我已经确定了预计位置以及从每个预计位置到每个站点的距离。如果有人可以帮助我在 R 中执行此操作,我将不胜感激,因为我有大量文件需要这样做,并且手动执行此操作会花费很长时间。我的示例数据集如下所示。

+----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| Proj_Loc       | 2026_1 | 2026_2 | 2026_3 | 2026_4 | site_1 | site_2 | site_3 | site_4 | site_5       |
+----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| P_129          | 24.46  | 25.2   | 26.54  | 28.49  | 39.96  |        |        |        |        |
| P_130          | 21.08  | 21.96  | 23.6   | 25.95  |        | 20.243 |        |        |        |
| P_131          | 25.2   | 25.99  | 27.2   | 29.07  |        | 17.679 |        |        |        |
| P_136          | 21.95  | 22.65  | 24.23  | 26.27  | 11.375 |        | 21.988 |        |        |
| P_137          | 16.02  | 16.92  | 19.08  | 21.8   | 24.922 | 29.99  | 17.613 | 34.637 | 33.041 |
+----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+

2026_1 到 2026_4 表示我的温度数据在列 Proj_Loc 给出的每个投影位置的时间分辨率。 site_1 到 site_5 是我选择的位置,我需要在这些位置找到与投影数据具有完全相同分辨率的反距离加权温度。 site_x 列表示从投影位置到给定站点的距离。我需要得到我的输出如下。

+--------+--------+--------+--------+--------+
|  site  | 2026_1 | 2026_2 | 2026_3 | 2026_4 |
+--------+--------+--------+--------+--------+
| site_1 | 20.805 |        |        |        |
| site_2 |        |        |        |        |
| site_3 |        |        |        |        |
| site_4 |        |        |        |        |
| site_5 |        |        |        |        |
+--------+--------+--------+--------+--------+

2026-1 的 site_1 反距离加权温度计算如下;总和((24.46/39.96)+(21.95/11.375)+(16.02/24.992))/((1/39.96)+(1/11.375)+(1/24.922))

非常感谢任何人的帮助。可以使用以下 dput 访问我的示例数据集。

dat= structure(list(Proj_Loc = structure(1:5, .Label = c("P_129", 
"P_130", "P_131", "P_136", "P_137"), class = "factor"), X2026_1 = c(24.46, 
21.08, 25.2, 21.95, 16.02), X2026_2 = c(25.2, 21.96, 25.99, 22.65, 
16.92), X2026_3 = c(26.54, 23.6, 27.2, 24.23, 19.08), X2026_4 = c(28.49, 
25.95, 29.07, 26.27, 21.8), site_1 = c(39.96, NA, NA, 11.375, 
24.922), site_2 = c(NA, 20.243, 17.679, NA, 29.99), site_3 = c(NA, 
NA, NA, 21.988, 17.613), site_4 = c(NA, NA, NA, NA, 34.637), 
site_5 = c(NA, NA, NA, NA, 33.041)), .Names = c("Proj_Loc", 
"X2026_1", "X2026_2", "X2026_3", "X2026_4", "site_1", "site_2", 
"site_3", "site_4", "site_5"), class = "data.frame", row.names = c(NA, 
-5L)) 

先整形,再加权平均

library(dplyr)
library(tidyr)

df <- gather(dat,key = sitename,value = siteval,site_1:site_5,na.rm = T)

df <- df %>%
    group_by(sitename) %>%
    summarize_each(funs(weighted.mean(.,siteval^-1,na.rm = T)),X2026_1:X2026_4)
a <- dat[2:5]
b <- dat[6:10]
outer(seq(ncol(b)), seq(ncol(a)), 
      Vectorize(function(i,j) sum(a[j]/b[i],na.rm=TRUE)/sum(1/b[i],na.rm=TRUE))
)
##          [,1]     [,2]     [,3]     [,4]
## [1,] 20.80583 21.56480 23.25761 25.46115
## [2,] 21.54172 22.38997 23.97984 26.22350
## [3,] 18.65744 19.46848 21.37052 23.78808
## [4,] 16.02000 16.92000 19.08000 21.80000
## [5,] 16.02000 16.92000 19.08000 21.80000

让我们获取每个分辨率下的两个子数据帧站点距离和温度

dat0 = dat[2:5]
dat1= dat[6:10]

做站点距离的倒数,因为我们处理的是 1/距离值

dat1=1/dat1

让我们转置 dat1

dat1=t(dat1)

现在,如果您注意到,您想要的数据框只是 dat1 和 dat0 除以 dat1 的行和的矩阵乘法

dat1=data.matrix(dat1)
dat0=data.matrix(dat0)

dat1[is.na(dat1)] = 0
outputDat = (dat1 %*% dat0)/rowSums(dat1)