r - 带有 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)
现在对于每次迭代,我想:
- 使用文件名在数据框上创建一个新列
- 在该列中插入对应的提取值
lat
和lon
我试过使用这个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]]
}
推荐阅读
- javascript - setInterval 和 clearInterval 不能一起工作
- vue.js - 观察对象数组内的数组
- javascript - 有没有用 React 处理事件的 DRYer 方式?
- flutter - 在 api 调用中使用提供程序
- r - ggplot2:如何将变量的值分配给ggplot标题
- asterisk - 在 Asterisk 中控制转移时的 SIP 电话音量
- android - 如何在 cameraX 预览中设置预览大小?
- mysql - 是否有 mysql 的 preg_replace 或完成相同操作的方法。?
- java - 使用来自 MySQL 的数据填充 JComboBox
- postgresql - 如何防止在硬关机后启动时删除 pg wals?