根据其他列修改列的值

时间:2020-03-02 09:33:17

标签: r

我的数据集包含在不同日期的不同区域的NDVI值和NDVI-QualityDescriptor值(PixelQa)。我基本上想擦除(设置为NA)与不良质量描述符(PixelQa)相关的NDVI值。列名称的后缀与这两个数据相关:PixelQa_1与NDVI_1相关,依此类推。

因此,为了“清除”数据,我必须检查PixelQa值,以评估是否必须更改其相关的NDVI值。有3种可能的情况:

  1. PixelQa是NA->那么NDVI也应该是NA。
  2. 像素Qa为66±0.5或130±0.5->那么NDVI保持相同的值。
  3. 像素Qa不同于66±0.5或130±0.5->然后NDVI值设置为NA(这是质量差的数据,需要忽略)。

我的数据集可能是:

declare 
    @pCaseId UNIQUEIDENTIFIER,
    @pFieldId UNIQUEIDENTIFIER,
    @pColumnName NVARCHAR(MAX),
    @pDateValue DATETIME,
    @pTableName nvarchar(MAX);

set @command = 'update ' + @pTableName + ' set ' + @pColumnName + ' = @dateValue where Id = @caseId';
exec sp_executesql 
    @command,
    N'@dateValue DATETIME, @caseId UNIQUEIDENTIFIER',
    @pDateValue, 
    @pCaseId
;

“干净”它应该看起来像:

DataNDVI_split <- data.frame("21feb1987_NDVI" = c(0.123, NA, 0.192, 0.234, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), "18jul1987_NDVI" = c(0.223, NA, 0.230, 0.334, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), stringsAsFactors = FALSE)
DataNDVI_split
  X21feb1987_NDVI1 X21feb1987_PixelQa1 X18jul1987_NDVI2 X21feb1987_PixelQa2
1           0.123              66.30           0.223                66.30
2              NA                 NA              NA                   NA
3           0.192              66.00           0.230                66.00
4           0.234              79.87           0.334                79.87
5              NA                 NA              NA                   NA

1 个答案:

答案 0 :(得分:0)

这是一个临时解决方案。 首先,我将数据分成两个单独的数据帧,因此:

df_ndvi <- DataNDVI[grepl("NDVI", DataNDVI$Data), ]
df_ndvi
   Data X21feb1987 X18jul1987
1 NDVI1      0.123      0.223
2 NDVI2         NA         NA
3 NDVI3      0.192      0.230
4 NDVI4      0.234      0.334
5 NDVI5         NA         NA

df_pixel <- DataNDVI[!grepl("NDVI", DataNDVI$Data), ]
df_pixel
       Data X21feb1987 X18jul1987
6  PixelQa1      66.30      66.00
7  PixelQa2         NA         NA
8  PixelQa3      66.00     124.23
9  PixelQa4      79.87      86.00
10 PixelQa5         NA         NA

要执行所需的更改,有很多可能的方法。一种方法是使用for中的所有列(第一个除外)中的df_ndvi循环并定义一个ifelse语句以查看条件是否成立并定义动作无论哪种情况都可以采取:

for(i in 2:3){
  df_ndvi[,i] <- ifelse(df_pixel[,i] < 65.5 | df_pixel[,i] > 66.5, NA, df_ndvi[,i])
}

这将导致df_ndvi中的这些更正:

df_ndvi
   Data X21feb1987 X18jul1987
1 NDVI1      0.123      0.223
2 NDVI2         NA         NA
3 NDVI3      0.192         NA
4 NDVI4         NA         NA
5 NDVI5         NA         NA

编辑

如果您希望以这种方式拆分数据:

DataNDVI_split <- data.frame("21feb1987_NDVI" = c(0.123, NA, 0.192, 0.234, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), "18jul1987_NDVI" = c(0.223, NA, 0.230, 0.334, NA), "21feb1987_PixelQa" = c(66.30, NA, 66.00, 79.87, NA), stringsAsFactors = FALSE)
DataNDVI_split
  X21feb1987_NDVI X21feb1987_PixelQa X18jul1987_NDVI X21feb1987_PixelQa.1
1           0.123              66.30           0.223                66.30
2              NA                 NA              NA                   NA
3           0.192              66.00           0.230                66.00
4           0.234              79.87           0.334                79.87
5              NA                 NA              NA                   NA

然后可以修改for循环:

for(i in c(1,3)){
  DataNDVI_split[,i] <- ifelse(DataNDVI_split[,i+1] < 65.5 | DataNDVI_split[,i+1] > 66.5, NA, DataNDVI_split[,i])
}

结果是这样的:

DataNDVI_split
  X21feb1987_NDVI X21feb1987_PixelQa X18jul1987_NDVI X21feb1987_PixelQa.1
1           0.123              66.30           0.223                66.30
2              NA                 NA              NA                   NA
3           0.192              66.00           0.230                66.00
4              NA              79.87              NA                79.87
5              NA                 NA              NA                   NA