如何使用R

时间:2016-07-01 02:29:48

标签: r

我想要做的最简单的描述是我在像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)

}

2 个答案:

答案 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的子集,您可以将其用于进一步分析。