для l oop с изменением выводит только последний результат - PullRequest
0 голосов
/ 02 августа 2020

Простите, если это дубликат, и из-за отсутствия воспроизводимости мне пришлось бы связать вам файлы.

Я пытаюсь сделать следующее:

У меня есть фрейм данных с координатами и именами, скажем,

df <- tribble(
  ~Species, ~lat, ~lon,
  "a",42.92991, 11.875801,
  "b",42.92991, 11.875801,
  "c",43.91278, 3.513611,   
  "d",43.60851, 3.871755,   
  "e",39.24373, 9.120478
)

У меня также есть папка с tif растрами, например

files <- list.files(path="~/world/", pattern="*.tif$", full.name=TRUE, all.files=TRUE)

Теперь для каждой итерации я ' я хотел бы:

  • создать новый столбец во фрейме данных с именем файла
  • вставить в этот столбец извлеченное значение для соответствующих lat и lon

Я пробовал использовать этот for l oop, и хотя на бумаге он выглядит нормально, я не понимаю, почему он выводит funvar только последний результат. Мне не нравится, что он перезаписывает результат вместо его добавления.

Если я использую аналогичный l oop с изменяемыми и более простыми объектами, он добавляет их, поэтому я не уверен, в чем может быть проблема

for(i in files){  
fraster<- raster(i)

fname<-gsub(".*//|[.].*", "", i)

funvar<-dplyr::mutate(fundata, !!fname:= raster::extract(fraster, coordinates(data.frame(lat,lon))))
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Из предоставленной вами информации я не могу сказать, сработает ли это, но обычно вы создаете RasterStack и избегаете l oop.

library(raster)
# NOTE the order of lon, lat`
xy <- cbind(lon, lat)
s <- stack(files)
e <- raster::extract(s, xy)

Если это невозможно, вы можете что-то сделать вот так

fundata <- data.frame(xy)
for (f in files){  
    fraster<- raster(f)
    fname <- gsub(".tif$", "", basename(f))
    fundata[[fname]] <- raster::extract(fraster, xy)
}
0 голосов
/ 03 августа 2020

То, как я решил это, похоже на взлом, но работает. Я явно назначаю новый столбец фрейму данных, вот так. Я до сих пор не понимаю, почему mutate не делает этого сам по себе

for(i in files){  
fraster<- raster(i)

fname<-gsub(".*//|[.].*", "", i)

funvar<-dplyr::mutate(fundata, !!fname:= raster::extract(fraster, coordinates(data.frame(lat,lon))))

fundata[fname] <- funvar[[fname]]
}
...