带有mutate的r-for循环只输出最后一个结果



如果它是重复的,我很抱歉,由于缺乏可复制性,我必须将文件链接到您。

我想做的是:

我有一个带有坐标和名称的数据帧,比如

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)

现在,对于每一次迭代,我都想:

  • 使用文件名在数据帧上创建一个新列
  • 在该列中插入相应latlon的提取值

我尝试过使用这个for循环,虽然在纸面上看起来很好,但我不明白为什么它只向funvar输出最后一个结果。我不喜欢它覆盖结果而不是附加它

如果我对mutate和更简单的对象使用类似的循环,它会附加它们,所以我不确定可能有什么问题

for(i in files){  
fraster<- raster(i)
fname<-gsub(".*//|[.].*", "", i)
funvar<-dplyr::mutate(fundata, !!fname:= raster::extract(fraster, coordinates(data.frame(lat,lon))))
}

谢谢!

我解决它的方法有点像破解,但很有效。我显式地将新列分配给数据帧,如下所示。我仍然不确定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]]
}

根据您提供的信息,我无法判断这是否有效,但通常情况下,您会制作RasterStack并避免循环。

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)
}

最新更新