我想要做的最简单的描述是我在像1,2,3,..., n, 1,2,3,...n,....
这样的data.frame中有一个列,我希望将第一个1 ... n组作为第一个1 ... n如2等等。
完整的背景是;我正在使用R spcosa
包在地块上进行等面积分层复合采样。我从一个包含许多多边形(地块)的GIS中的形状文件开始。我想要的最终结果是一个GIS文件,其中每个层和样本位置都是GIS文件格式,每个层和样本位置都标有地块,地层和样本ID。到目前为止,我可以做到这一切,除了一点,它确定了样本所属的层,并将其包含在样本标签中。样本标签需要看起来像“parcel#-strata#-composite#(其中#是数字)。实际上我不需要这个实际标签,而是GIS文件中的单独属性。
基本工作流程如下
对于使用spcosa :: stratify的每个单独的多边形,我将它划分为多个相等的区域层,如
strata.CSEA <- stratify(poly[i,], nStrata = n, nTry = 1, equalArea = TRUE, nGridCells = x)
注意spcosa::stratify
会生成CompactStratificationEqualArea
个对象。我将其转换为SpatialPixelData
,然后使用rasterToPolygon
将其作为GIS文件输出。
samples.SPRC <- spsample(strata.CSEA, n = n, type = "composite")
spcosa::spsample
会创建一个SamplingPatternRandomComposite
对象。我将此强制转换为SpatialPointsDataFrame
samples.SPDF <- as(samples.SPRC, "SpatialPointsDataFrame")
并在@data插槽中添加两列
samples.SPDF@data$Strata <- "this is the bit I can't do yet"
samples.SPDF@data$CEA <- poly[i,]$name
然后我可以将samples.SPDF
写成具有所有想要属性的GIS文件(即writeOGE)。
如上所述,我无法理解的部分是样本ID与地层id的关系。样本点是像1,2,3...n, 1,2,3...n,....
这样的向量。如何提取哪个样本与哪个层次相关?由于实际的阶层数是任意的,我可以分组(根据我上面的简单问题)但理想情况下我想使用实际阶层的编号,所以一切都排好了。
为了让任何贡献者能够访问示例,我会在spcosa文档中的代码下方进行复制,稍加修改以生成正确的对象。
# Note: the example below requires the 'rgdal'-package You may consider the 'maptools'-package as an alternative
if (require(rgdal)) {
# read a vector representation of the `Farmsum' field
shpFarmsum <- readOGR(
dsn = system.file("maps", package = "spcosa"),
layer = "farmsum"
)
# stratify `Farmsum' into 50 strata
# NB: increase argument 'nTry' to get better results
set.seed(314)
myStratification <- stratify(shpFarmsum, nStrata = 50, nTry = 1, equalArea = TRUE)
# sample two sampling units per stratum
mySamplingPattern <- spsample(myStratification, n = 2 type = "composite")
# plot the resulting sampling pattern on
# top of the stratification
plot(myStratification, mySamplingPattern)
}
答案 0 :(得分:0)
也许order()函数可以帮助你
n <- 10
dat <- data.frame(col1 = rep(1:n, 2), col2 = rnorm(2*n))
head(dat)
dat[order(dat$col1), ]
答案 1 :(得分:0)
我没有得到&#34; ID&#34; (1,2,3...n
)将被找到;因此,我们假设您的SpatialPolygonsDataFrame
名为shpFarmsum
,其中包含属性数据列&#34; ID&#34;。您可以通过shpFarmsum$ID
访问此列。因此,如果您想为每个ID创建单独的子集,这是一种方法:
for (i in unique(shpFarmsum$ID)) {
tempSubset shpFarmsum[shpFarmsum$ID == i,]
writeOGR(tempSubset, ".", paste0("subset_", i), driver = "ESRI Shapefile")
}
我添加了行writeOGR(...
,因此所有子集都会写入工作的direktory。但是,您可以更改此行或在for循环中添加进一步的分析。
工作原理
unique(shpFarmsum$ID)
提取所有出现的ID(可与您的1,2,3...n
比较)。
在for循环的每次重复中,此ID的另一个值将用于创建整个SpatialPolygonsDataFrame
的子集,您可以将其用于进一步分析。