带有 mutate 的 for 循环只输出最后的结果
for loop with mutate only outputs last result
如果它是重复的,我很抱歉,并且由于缺乏可重复性,我不得不 link 你的文件。
我想做的是:
我有一个包含坐标和名称的数据框,比方说
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]]
}
根据您提供的信息,我无法判断这是否可行,但通常您会制作一个 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)
}
如果它是重复的,我很抱歉,并且由于缺乏可重复性,我不得不 link 你的文件。
我想做的是:
我有一个包含坐标和名称的数据框,比方说
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]]
}
根据您提供的信息,我无法判断这是否可行,但通常您会制作一个 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)
}