首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遍历数据框中的每一行,从栅格中提取值并写入csv文件

遍历数据框中的每一行,从栅格中提取值并写入csv文件
EN

Stack Overflow用户
提问于 2016-01-12 01:10:45
回答 2查看 35.9K关注 0票数 1

我有一个包含Namelongitudelatitude列的数据框。我想要一个函数,它遍历每一行,从栅格堆栈中提取值,并基于Name列编写csv文件。

代码语言:javascript
运行
复制
Name    Lon     Lat
Name1   11.11   47.87
Name2   150.1   -40.4
Name3   -50.2   -3.5
Name4   -100.3  49.8

library(raster)
s <- stack(replicate(5, {raster(matrix(runif(2160*4320), 2160), 
         xmn=-180, xmx=180, ymn=-90, ymx=90)}))

I can do that one by one:

location <- data.frame(11.11, 47.87)
ex <- extract(s, location)
write.csv(ex, "Name1.csv")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-12 02:01:50

一种非常传统的方法使用for循环。

代码语言:javascript
运行
复制
d1 <-c("Name1", "Name2","Name3", "Name4")
d2 <- c(11.11,150.1,-50.2,-100.3)
d3 <-c(47.87, -40.4, -3.5, 49.8)
data.df <-data.frame(d1,d2,d3)

for(i in 1:nrow(data.df)) 
{
  location <- data.frame(data.df[i,2],data.df[,3])
  ex <- extract(s, location)
  fn1<-paste0(data.df[i,1],".csv")
  write.csv(ex, fn1)
}

将生成四个文件,其中包含如下信息:

代码语言:javascript
运行
复制
"","layer.1","layer.2","layer.3","layer.4","layer.5"
"1",0.471816286211833,0.115963410818949,0.399704266572371,0.464667820138857,0.820669727399945
"2",0.616754011251032,0.354018000885844,0.602565947687253,0.86519843316637,0.660861984360963
"3",0.0691961287520826,0.128835600335151,0.199198298621923,0.968016018159688,0.597145217470825

我希望这就是你想要的结果。可能会有一些更高级、更高效的方法(基于apply-family?)作为一个R初学者,我也很感兴趣。

票数 6
EN

Stack Overflow用户

发布于 2016-01-13 05:28:18

使用apply:

代码语言:javascript
运行
复制
library(raster)
s <- stack(replicate(5, {raster(matrix(runif(2160*4320), 2160), 
                                xmn=-180, xmx=180, ymn=-90, ymx=90)}))

d1 <-c("Name1", "Name2","Name3", "Name4")
d2 <- c(11.11,150.1,-50.2,-100.3)
d3 <-c(47.87, -40.4, -3.5, 49.8)
data.df <- data.frame("Name" = d1, "Lon" = d2, "Lat" = d3)

apply(X = data.df, 1, function(x, s) {
        location <- as.numeric(c(x[2], x[3]))
        ex <- extract(s, location)
        write.csv(ex, paste0(x[1], ".csv"))
}, s = s)

请注意,如果要在函数中使用它,则必须将s对象作为附加参数传递给函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34727250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档