如何在文本文件中使用数据?

时间:2015-11-27 22:01:38

标签: r raster

鉴于有三个栅格,我需要从文本文件u中提取与c(行)= 5和smoke(列)对应的值。

smoke <- matrix(c(5, 4, 2, 9, 2, 2), ncol=2, byrow=TRUE)

我使用的功能是:

library(raster)
r <- raster(nrows=10, ncols=10)
r <- setValues(r, 1:ncell(r))

func <- function(c, u, sit){
  rasters <- mget(c('r', paste0('r', 1:2)))
  x <- sapply(rasters, function(x) getValues(x, c)[u])
  y <- sapply(rasters, function(x) getValues(x, u)[c])
  g <- data.frame(y, x)
  write.table(g, paste0("res_", sit, u, "_", c, ".txt"))
}

以下是我如何使用该函数提取与c中的usmoke对应的值:

res <- lapply(split(smoke[,c('c', 'u', 'sit')], 1:nrow(smoke)), 
              FUN=function(x) func(c=x[1], u=x[2], sit=x[3]))

我收到此错误:error: value for ‘r’ not found

1 个答案:

答案 0 :(得分:1)

默认情况下,mget仅在其被调用的环境中查找对象rr1r2,但在您的情况下,这些对象是在全球环境中。您可以将inherits=TRUE添加到mget调用,这将强制它继续查看父环境,或者指定要使用envir=.GlobalEnv查看的环境。

但是你还有其他一些问题。

首先,您的示例中不存在r1r2

其次,split引起的列表是数据框列表,您需要在函数中对它们进行相应的索引。这意味着使用$表示法(例如x$c),双括号(例如x[[1]])或使用逗号(例如x[, 1])。

实现所有这些,你应该有:

func <- function(c, u, sit) {
  rasters <- mget(c('r', paste0('r', 1:2)), envir=.GlobalEnv)
  x <- sapply(rasters, function(x) getValues(x, c)[u])
  y <- sapply(rasters, function(x) getValues(x, u)[c])
  g <- data.frame(y, x)
  write.table(g, paste0("res_", sit, u, "_", c, ".txt"))
}

library(raster)
res <- lapply(split(smoke[, c('c', 'u', 'sit')], 1:nrow(smoke)), 
              function(x) func(c=x[[1]], u=x[[2]], sit=x[[3]]))

最后,res只是NULL值的列表,因为您的函数返回write.table的值,即NULL。如果您希望func返回g,请在函数中添加最后一行,只读取g(或明确地,return(g))。

我不确定您的小示例有多接近您的真实数据,但您可能更有效地处理此问题 - 请参阅?extract?cellFromRowCol?stack,示例