применить функцию к подмножествам данных - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь установить подкадр данных двумя переменными ('site' и 'year') и применить функцию (dismo :: biovars) к каждому подмножеству. Биовары требуют ежемесячных входных данных (12 значений) и выводят 19 переменных в год. Я хотел бы сохранить выходы для каждого подмножества и объединить их.

Пример данных:

data1<-data.frame(Meteostation=c(rep("OBERHOF",12),rep("SOELL",12)),
              Year=c(rep(1:12),rep(1:12)),
              tasmin=runif(24, min=-20, max=5),
              tasmax=runif(24, min=-1, max=30),
              pr=runif(24, min=0, max=300))

Полный набор данных содержит 900 станций и 200 лет.

IВ настоящее время я пытаюсь использовать вложенный цикл, который, как я понял, не самый эффективный, и который я пытаюсь сделать работу - код ниже:

sitesList <- as.character(unique(data1$Meteostation))
#yearsList<- unique(data1$Year)
bvList<-list()

for (i in c(1:length(unique(sitesList)))) {

   site<-filter(data1, Meteostation==sitesList[i])
   yearsList[i]<-unique(site$Year)

   for (j in c(1:length(yearsList))){

      timestep<-filter(site,Year==yearsList[j])
      tmin<-timestep$tasmin
      tmax<-timestep$tasmax
      pr<-timestep$pr

      bv<-biovars(pr,tmin,tmax)
      bvList[[j]]<- bv

}}

bv_all <- do.call(rbind, bvList)

Я знаю, что есть гораздо лучшие способыПойти об этом, и я искал варианты применения и dplyr решений, но я изо всех сил пытаюсь разобраться с этим. Любой совет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Вы можете использовать пакет dplyr, возможно, следующим образом?

library(dplyr)
data1 %>% 
    group_by(Meteostation, Year) %>%
    do(data.frame(biovars(.$pr, .$tasmin, .$tasmax)))
1 голос
/ 21 октября 2019

Используйте by и rbind результат.

library("dismo")
res <- do.call(rbind, by(data1, data1[c("Year", "Meteostation")], function(x) {
  cbind(x[c("Year", "Meteostation")], biovars(x$pr, x$tasmin, x$tasmax))
}))

Производит

head(res[, 1:10])
#   Meteostation Year      bio1     bio2 bio3 bio4       bio5       bio6     bio7 bio8
# 1      OBERHOF    1 12.932403 18.59525  100   NA 22.2300284   3.634777 18.59525   NA
# 2      OBERHOF    2  5.620587  7.66064  100   NA  9.4509069   1.790267  7.66064   NA
# 3      OBERHOF    3  0.245540 12.88662  100   NA  6.6888506  -6.197771 12.88662   NA
# 4      OBERHOF    4  5.680438 45.33159  100   NA 28.3462326 -16.985357 45.33159   NA
# 5      OBERHOF    5 -6.971906 16.83037  100   NA  1.4432801 -15.387092 16.83037   NA
# 6      OBERHOF    6 -7.915709 14.63323  100   NA -0.5990945 -15.232324 14.63323   NA
...