【问题标题】:R fill interpolated matrix with NA'sR 用 NA 填充插值矩阵
【发布时间】:2013-10-09 08:36:44
【问题描述】:

我使用 R 的 raster 包和 sampleStratified 函数从 raster 层中取出分层随机样本:

library(raster)
r<-raster(nrows=5, ncols=5)
r[]<-c(1,0,0,0,1,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1)


#Stratified random sample size
sampleStratified(r, size=5)
      cell layer
 [1,]    3     0
 [2,]   22     0
 [3,]    7     0
 [4,]   21     0
 [5,]   12     0
 [6,]   13     1
 [7,]   17     1
 [8,]   11     1
 [9,]    8     1
[10,]   23     1

我现在想做的是按第一列对样本进行排序,对第一列进行插值以获得栅格的原始长度,并用 NA 填充第二列的缺失值,如下所示:

   [,1] [,2]
 [1,]    1   NA
 [2,]    2   NA
 [3,]    3    0
 [4,]    4   NA
 [5,]    5   NA
 [6,]    6   NA
 [7,]    7    0
 [8,]    8    1
 [9,]    9   NA
[10,]   10   NA
[11,]   11    1
[12,]   12    0
[13,]   13    1
[14,]   14   NA
[15,]   15   NA
[16,]   16   NA
[17,]   17    1
[18,]   18   NA
[19,]   19   NA
[20,]   20   NA
[21,]   21    0
[22,]   22    0
[23,]   23    1
[24,]   24   NA
[25,]   25   NA

我尝试使用 simecol 包中的 approxTime 函数,但填充 NA 失败。我有 10 个栅格图层,每个图层大约有 500,000 个值,因此非常感谢快速方法。

【问题讨论】:

  • 我不熟悉空间包,但通常的方法是使用merge 或与data.tables 进行连接。

标签: r interpolation raster na


【解决方案1】:

我会反其道而行之。您已经知道要更改的单元格是那些不在随机样本中的单元格,而不是可能很昂贵的插值。因此,使用您的随机样本作为您不想想要更改的单元格编号的索引向量,只需对那些未出现在分层样本中的单元格索引使用[&lt;- 替换方法。我们将raster 方法用于基本函数[&lt;-%in% 以及seq_len。原谅稍微冗长的例子,最好显示步骤。应该很快,我认为 500,000 个单元格的栅格不会有任何问题...

# For reproducible example
set.seed(1)

#  Get stratified random sample
ids <- sampleStratified(r, size=5)

#  Copy of original raster (to visualise difference)
r2 <- r

# Get set of cell indices
cell_no <- seq_len(ncell(r2)) 

# Those indices to replace are those not in the random sample
repl <- cell_no[ ! cell_no %in% ids[,1] ]

#  Replace cells not in sample with NA
r2[ repl ] <- NA

# Plot to show what is going on
par( mfrow = c(1,2))
plot(r)
plot(r2)

【讨论】:

    【解决方案2】:

    我会按照@Roland 的建议使用merge

    mm <- data.frame(col1 = sample(1:100, 50), col2 = sample(0:1, 50, replace = TRUE))
    mm <- as.matrix(mm[order(mm[, 1]), ])
    mdl <- as.matrix(data.frame(col1 = 1:100, col2 = NA))
    merge(mdl, mm, by = "col1", all.x = TRUE)
    
        col1 col2.x col2.y
    1      1     NA     NA
    2      2     NA      0
    3      3     NA      0
    4      4     NA     NA
    5      5     NA     NA
    6      6     NA     NA
    7      7     NA      0
    8      8     NA      1
    9      9     NA     NA
    10    10     NA      0
    11    11     NA     NA
    12    12     NA      0
    13    13     NA      1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 2016-06-26
      • 2021-09-29
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多