【问题标题】:Conditional replacement of NAs in two rasters of same dimensions R有条件地替换两个相同维度 R 栅格中的 NA
【发布时间】:2016-09-26 16:54:43
【问题描述】:

这个问题与Conditional replacement of NAs in two dataframes R 相关联,但我想在栅格上做同样的事情,而不是将df1df2 转换为数据框。

给定两个相同尺寸的栅格 (df1,df2):

df1: dimensions  : 510, 1068, 544680, 1  (nrow, ncol, ncell, nlayers)

df2: dimensions  : 510, 1068, 544680, 1  (nrow, ncol, ncell, nlayers)

如何找到df1中的所有列,其中所有行都是NAs,转到df2并将匹配列中的所有值设置为NAs

【问题讨论】:

  • 我认为您无论如何都需要提取 df1 x y 值(通过辅助函数或矩阵索引),找到所有 NA 的行号,然后在 df2 中设置值。我没有发现这样做有什么特别的困难。
  • @dracodoc 一个例子会很有帮助。谢谢。
  • 可以生成样本数据吗?
  • @dracodoc 这里是示例数据:library(raster) r <- raster(nrow=5, ncol=5) df1 <- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) df2<- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) df1[1,]<-NA df1[]

标签: r raster na


【解决方案1】:

首先,OP在对dracodoc的评论中生成样本数据的方式与OP的问题不一致:

library(raster) 
r <- raster(nrow=5, ncol=5) 
df1 <- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df2<- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df1[1,]<-NA

这会将df1 的每一层的第一 设置为NA。那么问题应该是:

如何找到df1 中所有列都是NAs 的所有行,转到df2 并将匹配行中的所有值设置为NAs?

我会先回答这个问题,然后解决以下的补码问题:

如何找到df1 中所有行都是NAs 的所有列,转到df2 并将匹配列中的所有值设置为NAs?

这是 OP 的原始问题。

df1 中的NA 行设置为df2 中的NA

要回答第一个问题,请模拟另一个示例数据集,其中层、行和列的数字不同;然后,设置 在df1NA 的每一层中不同 行:

set.seed(123) ## only for full reproducibility
library(raster) 
r <- raster(nrow=7, ncol=5)  ## 7 rows to differentiate from 5 columns
nlayers <- 6
df1 <- stack(sapply(1:nlayers, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df2<- stack(sapply(1:nlayers, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df1[[1]][1,]<-NA  ## set row 1 of layer 1 to NA 
df1[[1]][2,]<-NA  ## set row 2 of layer 1 to NA 
df1[[2]][2,]<-NA  ## set row 2 of layer 2 to NA 
df1[[3]][2,]<-NA  ## set row 2 of layer 3 to NA 
df1[[4]][5,]<-NA  ## set row 5 of layer 4 to NA 
df1[[5]][5,]<-NA  ## set row 5 of layer 5 to NA 
df1[[6]][3,]<-NA  ## set row 3 of layer 6 to NA 

请注意,df1 看起来像:

df1[]
##         layer.1    layer.2    layer.3    layer.4    layer.5   layer.6
## [1,]         NA  4.0659208  1.5269065  3.8649168  7.1053530  2.712011
## [2,]         NA  3.6617530 -3.9275066  1.6452866  4.2134075  6.113365
## [3,]         NA  1.8142649  6.0172156 -1.0038258  0.2835675  6.931442
## [4,]         NA  1.0821120  0.8723977  2.8593204  0.4559970  7.309570
## [5,]         NA  0.8585870  0.9359742  6.7569898  0.1953915  4.624904
## [6,]         NA         NA         NA  2.2739591  3.4072804  2.810022
## [7,]         NA         NA         NA  5.8238930  0.6147332  9.789556
## [8,]         NA         NA         NA -0.8536481  7.0637503  4.951049
## [9,]         NA         NA         NA  3.8333141 11.3003268  3.403461
##[10,]         NA         NA         NA  5.5582216  1.1389086  5.291161
##[11,]  4.6722454 -1.3693257  3.0172926  4.9034601  7.3632165        NA
##[12,]  2.0794415  0.7913455  4.1558412  4.3170286  7.3071267        NA
##[13,]  2.2023144  0.6000339  1.8880199  2.0778820  5.9966077        NA
##[14,]  1.3320481  4.3398954  4.9331296  1.4508870  1.9748702        NA
##[15,] -0.6675234  1.7498928  2.3385403  0.9276136  4.6416422        NA
##[16,]  6.3607394  2.7599555  3.9953459  4.3529398  4.1588140  6.643336
##[17,]  2.4935514  1.9143597  6.2905170  1.1575762  6.6889686  5.025942
##[18,] -4.8998515  1.8713886  4.3055445  2.5283277  3.8826837  6.283751
##[19,]  3.1040677  6.1058069  2.0222052  3.2317234  7.9309202  3.313910
##[20,] -0.4183742  1.3226870  6.4464229  9.5315860  3.8762574  2.067595
##[21,] -2.2034711  6.5494118  5.9805116         NA         NA 11.991640
##[22,]  0.3460753 -2.6462584  4.6451909         NA         NA  7.802126
##[23,] -2.0780133  3.7538412  3.7161952         NA         NA  2.246186
##[24,] -1.1866737  2.3715627  1.1162818         NA         NA  4.166502
##[25,] -0.8751178  2.6478247  7.0819573         NA         NA  2.443560
##[26,] -4.0600799  3.1389184  1.1992212  8.3336526  5.8946828 12.596431
##[27,]  3.5133611  0.4930296  9.5619990  5.3545122  6.9097090  9.937239
##[28,]  1.4601194  1.0003778  7.5978319  4.1236988  3.5486581  5.204565
##[29,] -2.4144108 -1.0557261  2.2928989  2.7325095  6.5505861  7.629582
##[30,]  4.7614448 -1.2153737 -0.0792627 -2.1597417  6.1068936  4.756980
##[31,]  2.2793927  2.9105859  0.8687803  7.3940116  4.3538585  4.571259
##[32,]  0.1147856  3.3446293  3.7706511 -0.3819202  5.1958791  3.634191
##[33,]  3.6853770  2.1590127  2.2599244  6.2198425  4.8977982  4.216148
##[34,]  3.6344005  4.7668024  1.9573722  9.7273107 11.3853557 10.952722
##[35,]  3.4647432  8.1502541  0.1451443 -0.3316795  2.7759917  5.837916

请注意,现在很明显,此显示中的每一层列都是按行优先顺序排列的栅格。

要查找df1 中每一层中所有NAs 的行,我们从OP 的链接SO 问题/答案中借用了akrun 的解决方案,它同样适用于Raster* 对象:

inds <- which(!rowSums(!is.na(df1)), arr.ind=TRUE)
##     row col
##[1,]   1   1
##[2,]   2   1
##[3,]   2   2
##[4,]   2   3
##[5,]   5   4
##[6,]   5   5
##[7,]   3   6

which(..., arr.ind=TRUE) 作为其第一列返回,作为其第二列返回 df 都是NAs。然后我们可以子集df2 使用循环层将这些行设置为NA

## loop over layers and set the appropriate row for each layer
for (i in seq_len(nrow(inds))) df2[[inds[i,2]]][inds[i,1],] <- NA
df2[]
##        layer.1      layer.2    layer.3     layer.4    layer.5   layer.6
## [1,]          NA  7.707085465 -2.0024253  6.11057171  8.0448295 10.135710
## [2,]          NA  1.697075344  5.2094879  3.68298600 -0.9782455  7.368709
## [3,]          NA -2.079522111  4.1580797  0.22405412  3.7181621  2.593235
## [4,]          NA  0.005691694  2.2030451  9.05330712  5.3499119  4.693064
## [5,]          NA  3.456379937  3.3544335  6.73417388  2.3203773  7.038311
## [6,]          NA           NA         NA  4.71229082  6.0017088  4.058863
## [7,]          NA           NA         NA  7.65432583  6.2342898 -0.472939
## [8,]          NA           NA         NA -0.01632286  4.9008915  8.652752
## [9,]          NA           NA         NA  5.98246089 -2.3976946  3.511567
##[10,]          NA           NA         NA  2.43126287 12.7143744  4.279319
##[11,] -0.72192044  1.734304664  6.5051516  6.05123657  4.3841022        NA
##[12,]  2.85395745  5.242398488  6.1625431  3.81753414  6.9535798        NA
##[13,]  4.32954442  3.892262347  6.4357893  5.89888214  5.8212995        NA
##[14,]  3.12276506  1.659080313  1.2675960  8.00655285  8.0740197        NA
##[15,] -0.09097189 -2.598706009  9.0074482  4.02187027  7.4529783        NA
##[16,]  1.17924981  0.436648047  3.2001026  7.05267591  4.3706205  5.779332
##[17,] -1.11378939  0.530388641  8.6005555  0.43469789  6.1345033  2.494046
##[18,] -1.15165448  2.141463298 -1.0527081  1.83518668  2.1637735  4.095755
##[19,]  3.65395150  5.900596033  3.0629508  8.55765313  7.5707690  5.913475
##[20,] -2.04677774  8.879236921  6.7497437  5.13216392  3.6168850  8.012088
##[21,]  6.86588190  6.642743177  0.8542734          NA         NA  1.048360
##[22,]  0.72904122  1.600547107  0.7419331          NA         NA  4.950737
##[23,]  1.64361648 -3.269582187  0.1843839          NA         NA  8.269219
##[24,] -1.21558311  0.833660408 -0.1575398          NA         NA  4.383573
##[25,] -0.72316607  2.267621669  1.6885214          NA         NA  6.681876
##[26,] -2.95104840  4.535039012  3.9935375  5.87256242  3.2315569  7.476686
##[27,]  0.45122383  4.887583905 -3.0426315  6.87701613  2.0096578  6.803505
##[28,]  2.25694721  4.052928288  3.6359413  9.01316449  5.4334271  7.959773
##[29,]  1.97291303 -2.185823049  6.7100251  4.16805020  4.9570778  5.631874
##[30,] -1.34460946  4.548929137  9.1127221  3.84405428 -0.3708437  4.758970
##[31,] -1.36586591  0.660328351  6.9035280 -1.25971208  5.1036532 -1.929447
##[32,] -0.50659616  2.524408100  5.2703243  4.29798278  5.5706909  5.721177
##[33,]  5.48818201  2.223653532 -2.1801912  2.28444983  5.5241792  7.290854
##[34,] -2.41191086  3.284500295  1.1954799  1.07797125  1.8349489  7.606197
##[35,]  0.46284522  2.074024948  1.9438606  3.46028131  6.4283998  4.334165

df1 中的NA 列设置为df2 中的NA

对于补题,模拟数据集为:

set.seed(123) ## only for full reproducibility
library(raster) 
r <- raster(nrow=7, ncol=5)
nlayers <- 6
df1 <- stack(sapply(1:nlayers, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df2<- stack(sapply(1:nlayers, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df1[[1]][,1]<-NA  ## set column 1 of layer 1 to NA 
df1[[1]][,2]<-NA  ## set column 2 of layer 1 to NA 
df1[[2]][,2]<-NA  ## set column 2 of layer 2 to NA 
df1[[3]][,2]<-NA  ## set column 2 of layer 3 to NA 
df1[[4]][,5]<-NA  ## set column 5 of layer 4 to NA 
df1[[5]][,5]<-NA  ## set column 5 of layer 5 to NA 
df1[[6]][,3]<-NA  ## set column 3 of layer 6 to NA 

请注意,df1 现在看起来像:

df1[]
##         layer.1     layer.2    layer.3    layer.4    layer.5   layer.6
## [1,]         NA  4.06592076  1.5269065  3.8649168  7.1053530  2.712011
## [2,]         NA          NA         NA  1.6452866  4.2134075  6.113365
## [3,]  5.6761249  1.81426487  6.0172156 -1.0038258  0.2835675        NA
## [4,]  1.2115252  1.08211201  0.8723977  2.8593204  0.4559970  7.309570
## [5,]  1.3878632  0.85858700  0.9359742         NA         NA  4.624904
## [6,]         NA -0.08412094  6.0767141  2.2739591  3.4072804  2.810022
## [7,]         NA          NA         NA  5.8238930  0.6147332  9.789556
## [8,] -2.7951837 -1.79618905 -0.6621531 -0.8536481  7.0637503        NA
## [9,] -1.0605586  8.50686790  3.5439104  3.8333141 11.3003268  3.403461
##[10,] -0.3369859  5.62388599  2.5833259         NA         NA  5.291161
##[11,]         NA -1.36932575  3.0172926  4.9034601  7.3632165  5.408472
##[12,]         NA          NA         NA  4.3170286  7.3071267  9.329761
##[13,]  2.2023144  0.60003394  1.8880199  2.0778820  5.9966077        NA
##[14,]  1.3320481  4.33989536  4.9331296  1.4508870  1.9748702  8.262161
##[15,] -0.6675234  1.74989280  2.3385403         NA         NA  4.502124
##[16,]         NA  2.75995554  3.9953459  4.3529398  4.1588140  6.643336
##[17,]         NA          NA         NA  1.1575762  6.6889686  5.025942
##[18,] -4.8998515  1.87138863  4.3055445  2.5283277  3.8826837        NA
##[19,]  3.1040677  6.10580685  2.0222052  3.2317234  7.9309202  3.313910
##[20,] -0.4183742  1.32268704  6.4464229         NA         NA  2.067595
##[21,]         NA  6.54941181  5.9805116  2.0441503  8.1581344 11.991640
##[22,]         NA          NA         NA  4.7061597  1.8524690  7.802126
##[23,] -2.0780133  3.75384125  3.7161952  4.2338825  1.2195343        NA
##[24,] -1.1866737  2.37156273  1.1162818  1.1144301 14.7231198  4.166502
##[25,] -0.8751178  2.64782471  7.0819573         NA         NA  2.443560
##[26,]         NA  3.13891845  1.1992212  8.3336526  5.8946828 12.596431
##[27,]         NA          NA         NA  5.3545122  6.9097090  9.937239
##[28,]  1.4601194  1.00037785  7.5978319  4.1236988  3.5486581        NA
##[29,] -2.4144108 -1.05572615  2.2928989  2.7325095  6.5505861  7.629582
##[30,]  4.7614448 -1.21537368 -0.0792627         NA         NA  4.756980
##[31,]         NA  2.91058592  0.8687803  7.3940116  4.3538585  4.571259
##[32,]         NA          NA         NA -0.3819202  5.1958791  3.634191
##[33,]  3.6853770  2.15901268  2.2599244  6.2198425  4.8977982        NA
##[34,]  3.6344005  4.76680240  1.9573722  9.7273107 11.3853557 10.952722
##[35,]  3.4647432  8.15025406  0.1451443         NA         NA  5.837916

除了现在我们使用colSums而不是rowSums之外,解决方案是相同的,并且我们为每一层设置列而不是行:

inds <- which(!colSums(!is.na(df1)), arr.ind=TRUE)
## loop over layers and set the appropriate column for each layer
for (i in seq_len(nrow(inds))) df2[[inds[i,2]]][,inds[i,1]] <- NA
df2[]
##        layer.1      layer.2    layer.3     layer.4     layer.5   layer.6
## [1,]          NA  7.707085465 -2.0024253  6.11057171  8.04482952 10.135710
## [2,]          NA           NA         NA  3.68298600 -0.97824547  7.368709
## [3,]  4.69742764 -2.079522111  4.1580797  0.22405412  3.71816214        NA
## [4,] -0.54819149  0.005691694  2.2030451  9.05330712  5.34991185  4.693064
## [5,] -1.97752145  3.456379937  3.3544335          NA          NA  7.038311
## [6,]          NA  0.873191385  3.4021159  4.71229082  6.00170883  4.058863
## [7,]          NA           NA         NA  7.65432583  6.23428976 -0.472939
## [8,] -1.16919791  0.968248298  7.9225385 -0.01632286  4.90089152        NA
## [9,] -2.70881936  2.271489941  2.3428489  5.98246089 -2.39769458  3.511567
##[10,] -2.85414717  6.795526313  3.5041962          NA          NA  4.279319
##[11,]          NA  1.734304664  6.5051516  6.05123657  4.38410223 10.511702
##[12,]          NA           NA         NA  3.81753414  6.95357984  3.677565
##[13,]  4.32954442  3.892262347  6.4357893  5.89888214  5.82129947        NA
##[14,]  3.12276506  1.659080313  1.2675960  8.00655285  8.07401970  2.217951
##[15,] -0.09097189 -2.598706009  9.0074482          NA          NA  4.936373
##[16,]          NA  0.436648047  3.2001026  7.05267591  4.37062049  5.779332
##[17,]          NA           NA         NA  0.43469789  6.13450332  2.494046
##[18,] -1.15165448  2.141463298 -1.0527081  1.83518668  2.16377351        NA
##[19,]  3.65395150  5.900596033  3.0629508  8.55765313  7.57076903  5.913475
##[20,] -2.04677774  8.879236921  6.7497437          NA          NA  8.012088
##[21,]          NA  6.642743177  0.8542734 -2.15666846 12.25032006  1.048360
##[22,]          NA           NA         NA -0.09211236  0.04685331  4.950737
##[23,]  1.64361648 -3.269582187  0.1843839  3.39765695  3.60803827        NA
##[24,] -1.21558311  0.833660408 -0.1575398  6.59733821  7.47613959  4.383573
##[25,] -0.72316607  2.267621669  1.6885214          NA          NA  6.681876
##[26,]          NA  4.535039012  3.9935375  5.87256242  3.23155688  7.476686
##[27,]          NA           NA         NA  6.87701613  2.00965777  6.803505
##[28,]  2.25694721  4.052928288  3.6359413  9.01316449  5.43342711        NA
##[29,]  1.97291303 -2.185823049  6.7100251  4.16805020  4.95707776  5.631874
##[30,] -1.34460946  4.548929137  9.1127221          NA          NA  4.758970
##[31,]          NA  0.660328351  6.9035280 -1.25971208  5.10365320 -1.929447
##[32,]          NA           NA         NA  4.29798278  5.57069095  5.721177
##[33,]  5.48818201  2.223653532 -2.1801912  2.28444983  5.52417919        NA
##[34,] -2.41191086  3.284500295  1.1954799  1.07797125  1.83494887  7.606197
##[35,]  0.46284522  2.074024948  1.9438606          NA          NA  4.334165

【讨论】:

  • 感谢您提供以上所有细节。我将尝试提出的解决方案并得到反馈。更清楚地说,我想在所有层中找到df1 网格和NAs,转到df2 并将匹配网格也设置为NAs。希望您的解决方案之一能够做到这一点。
【解决方案2】:

鉴于报告的示例数据,如果我很好地理解了这个问题,这应该是诀窍:

library(raster)
r <- raster(nrow=5, ncol=5) 
df1 <- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df2<- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df1[1,]<-NA 
head(df1)

sumrows <- raster::rowSums(df1, na.rm = T) # if all NA in row, the sum is 0
where_NA <- which(sumrows[1,] == 0) # find 0 sum rows
df2[1,where_NA] <- NA
head(df2)

但是,如果您的“行”全为零,这将失败。如果发生这种情况(如下面修改后的示例数据),您可以这样做:

library(raster)
r <- raster(nrow=5, ncol=5) 
df1 <- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df2<- stack( sapply(1:5, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
df1[1,]<-NA 
df1[1,5] <- 0
head(df1)

sumrows <- raster::rowSums(df1, na.rm = T) # if all NA in row, the sum is 0
where_sum0 <- which(sumrows [1,] == 0)  # rows adding up to 0 

# Find rows adding up to 0 not due to all NAs
min_df1 <- min(df1, na.rm = T)   
max_df1 <- max(df1, na.rm = T)
where_sum0_nonNA <- which(sumrows [1,] == 0 & (!is.na(min_df1[1,]) & !is.na(max_df1[1,]))) 

# Find rows to delete 
where_del <- setdiff(where_sum0, where_sum0_nonNA)

# find "rows" with 0 sum and min and max not zero
df2[1,where_del] <- NA                      # replace in df2
head(df2)

但这实际上应该回答这个问题:

给定一个多波段栅格 df1,识别 所有 波段中具有 NA 的 像素。然后将第二个栅格 df2 中相同像素的所有波段设置为 NA。

,这就是 OP 似乎在问的问题(也给出了他的最后评论)

HTH!

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 2015-09-15
    • 2012-08-11
    • 1970-01-01
    • 2018-12-11
    • 2016-07-31
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    相关资源
    最近更新 更多