首页 > 解决方案 > 带有 mutate 的 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)

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

我试过使用这个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))))
}

谢谢!

标签: rtidyversegeo

解决方案


我解决它的方式有点像黑客,但有效。我明确地将新列分配给数据框,如下所示。我仍然不确定为什么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]]
}

推荐阅读