Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R中的函数对光栅和位置列表进行采样_R_List_Function_Raster_Lapply - Fatal编程技术网

使用R中的函数对光栅和位置列表进行采样

使用R中的函数对光栅和位置列表进行采样,r,list,function,raster,lapply,R,List,Function,Raster,Lapply,这段代码让我汗流浃背。我以前得到过建造它的帮助。简言之,我在这里所做的是随机采样次数numberv的三个光栅列表。因此,输出是四个列表的列表,每个列表有三个光栅。在获得随机点位置后,我将获取该位置的光栅值。 我想解决的问题是,我想获取第二个采样位置,即采样。设置[[1]][2],并从光栅[1]获取光栅值。然后我想取样本。设置[[1]][3]并从光栅[2]获取光栅值。然后sample.设置[[2]][2]并从rasters[1]和sample.获取光栅值。设置[[2]][3]并从rasters[2

这段代码让我汗流浃背。我以前得到过建造它的帮助。简言之,我在这里所做的是随机采样次数
numberv
的三个光栅列表。因此,输出是四个列表的列表,每个列表有三个光栅。在获得随机点位置后,我将获取该位置的光栅值。 我想解决的问题是,我想获取第二个采样位置,即
采样。设置[[1]][2]
,并从
光栅[1]
获取光栅值。然后我想取
样本。设置[[1]][3]
并从
光栅[2]
获取光栅值。然后
sample.设置[[2]][2]
并从
rasters[1]
sample.获取光栅值。设置[[2]][3]
并从
rasters[2]
等获取光栅值。结果将是一个包含4个列表的列表,每个列表包含2个元素,其中包含示例xy值(位置)和以前的光栅值。 非常感谢您的帮助

y <- matrix(1:150,50,3)
mv <- c(1,2,3)
rep = 20

valuematrix <- vector("list",ncol(y))

for (i in 1:ncol(y)) {
        newmatrix <- replicate(rep,y[,i])
        valuematrix[[i]] <- newmatrix
}

library(sp)
library(raster)

rasters <- setNames(lapply(valuematrix, function(x) raster(x)), 
                    paste0('raster',1:length(mv)))

# Create a loop that will sample the rasters
library(dismo)

numberv = c(10,12,14,16)        # sample number vector 

# Function to sample using a given number (returns list of three)
sample.number <- function(x) {
        rps <- lapply(rasters, function(y) randomPoints(raster(y),n=x))
        setNames(rps,paste0('sample',1:length(mv)))
}

# Apply sample.number() to your numberv list
sample.set <- lapply(numberv,sample.number)

# Function to extract values from a given sample
sample.extract <- function(x) {
        lapply(1:length(x),function(y) data.frame(x[[y]],
                                                  extract(rasters[[y]],x[[y]])))
}

# Apply sample.extract() to the set of samples (returns list of four lists)
sample.values <- lapply(sample.set,sample.extract)
成功地解决了这个问题(对我自己来说是个高五;) 不幸的是,我成功地用一个循环实现了这一点,如果能看到一个函数的例子就太好了

samplevaluesnext <- vector("list",length(sample.set))

## Look up values
for (j in 1:length(sample.set)) {
        for (i in 1:(length(rasters)-1)) {
                samplevaluesnext[[j]][[i]] <- data.frame(sample.set[[j]][[i+1]],
                                                         extract(rasters[[i]], 
                                                                 as.data.frame(sample.set[[j]][i+1])))
        }
}

samplevalues下一步为什么要循环采样?使用
caret
包的
createDataPartition
。它就是为这个设计的。谢谢,我会去看看的
samplevaluesnext <- vector("list",length(sample.set))

## Look up values
for (j in 1:length(sample.set)) {
        for (i in 1:(length(rasters)-1)) {
                samplevaluesnext[[j]][[i]] <- data.frame(sample.set[[j]][[i+1]],
                                                         extract(rasters[[i]], 
                                                                 as.data.frame(sample.set[[j]][i+1])))
        }
}