2016-05-05 3 views
-3

Я пытаюсь вычислить значения взвешенной температуры инверсии для выбранных объектов на основе прогнозируемой температуры в радиусе 40 км к данному участку. Я определил прогнозируемые местоположения и расстояния от каждого прогнозируемого местоположения до каждого сайта. Я был бы признателен, если бы кто-нибудь мог помочь мне сделать это в R, потому что у меня есть большое количество файлов, чтобы сделать это, и он потребляет очень много времени, чтобы сделать это вручную. Мой примерный набор данных выглядит следующим образом.Как вычислить значение с использованием выбранных ячеек в 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 |  |  |  |  | 
+--------+--------+--------+--------+--------+

Рассчитанная на величину обратного расстояния site_1 для 2026-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)) 
+2

Какой код вы пробовали себя? – zacdav

+0

@MatthewLundberg у этого вопроса явно не хватает попыток части пользователей в пределах R. Я чувствую, что в этом случае все еще хороший вопрос, вы подразумеваете что-то? – zacdav

+0

@zacdav Я подразумеваю, что «что вы пробовали», как правило, не является полезным комментарием. –

ответ

1

Позволяет получить расстояние два суб-dataframes сайта, и температуры в каждой резолюции

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

ли инверсию сайта Расстояние, поскольку мы имеем дело с 1/расстояние значения

dat1=1/dat1 

Позволяет выполнять транспонирование dat1

dat1=t(dat1) 

Теперь, если вы заметили, кадр данных, которые вы хотите, это просто матрица умножения dat1 и DAT0 разделенная на rowsums из DAT1

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

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

Измените форму сначала, а затем взвешивайте средние значения.

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) 
+0

Я застрял и благодарю вас за помощь. Все три ответа работают. – Doo

0
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