将for循环中每个迭代的行编译为R中的数据帧时的列顺序切换
我试图通过for循环对多个站点进行采样,每个站点都有一个光栅堆栈,并将每个采样添加到一个数据帧中。我尝试堆叠光栅,创建一个数据帧,并在将其添加到列表之前随机采样。然后在循环之外,我将列表编译成一个数据帧。 但是,当我运行代码时,第一次迭代有列(X,Y,raster1,raster2),而其余的迭代将列顺序切换为(raster1,raster2,X,Y)。如何在每次迭代中使列处于相同的位置 此外,当使用聚合版本的光栅(2m分辨率)测试循环时,效果良好。我只得到更高分辨率(2厘米分辨率)的问题将for循环中每个迭代的行编译为R中的数据帧时的列顺序切换,r,dataframe,for-loop,raster,R,Dataframe,For Loop,Raster,我试图通过for循环对多个站点进行采样,每个站点都有一个光栅堆栈,并将每个采样添加到一个数据帧中。我尝试堆叠光栅,创建一个数据帧,并在将其添加到列表之前随机采样。然后在循环之外,我将列表编译成一个数据帧。 但是,当我运行代码时,第一次迭代有列(X,Y,raster1,raster2),而其余的迭代将列顺序切换为(raster1,raster2,X,Y)。如何在每次迭代中使列处于相同的位置 此外,当使用聚合版本的光栅(2m分辨率)测试循环时,效果良好。我只得到更高分辨率(2厘米分辨率)的问题 ra
raster1嗨,我没有看到任何跳出的bug。添加调试代码。例如,在流程的不同点添加print(names(stack.df))
,以缩小范围并识别有问题的代码。错误可能是这一行stack.df谢谢你的建议@M.Viking我把它缩小到这一行,stack.df嗨,我没有看到任何跳出的错误。添加调试代码。例如,在流程的不同点添加print(names(stack.df))
,以缩小范围并识别有问题的代码。bug可能是这一行stack.df谢谢你的建议@M.Viking我把它缩小到这一行stack.df
raster1 <- raster("ras1.tif")
raster2.list <- list("./ras2a.tif", "./ras2b.tif", "./ras2c.tif", "./ras2d.tif")
names(raster2.list) <- c("ras2a", "ras2b", "ras2c", "ras2d")
#name all variables in for loop
siteID <- list("ras2a", "ras2b", "ras2c", "ras2d")
#Create master list
master.list = list()
#For loop
for (i in raster2.list) {
#import raster
ras2 <- raster(i)
print("imported ras2...")
#match ras1 projection, resolution and extent to ras2 raster
ras1 <- projectRaster(raster1, #original raster
ras2, #raster with desired projection, resolution, and extent
method = "bilinear")
print("reprojected ras1 to ras2...")
#stack rasters
stack.ras <- stack(ras2, ras1)
print("stacked rasters...")
#convert stack to df, remove NA rows...
set.seed(100)
stack.df <- as.data.frame(stack.ras, na.rm = T, xy=T)
stack.df <- stack.df[sample(nrow(stack.df),100),]
colnames(stack.df)[c(1,2)] <- c("ras2","ras1")
print("converted raster stack to dataframe and sampled random points...")
print("adding stack to list...")
#add each site iteration to list
master.list[[i]] <- stack.df
print("Done!")
}
#turn master list into df with all sites by row
master.df <- data.table::rbindlist(master.list, use.names=FALSE)
master.df <- as.data.frame(master.df)