我有数据集(例如部分)
ndvi=structure(list(district_id = c(72L, 58L, 72L, 58L, 72L, 58L,
58L, 72L, 72L, 72L, 72L, 72L, 72L, 58L, 72L, 58L, 72L, 58L, 72L,
58L, 72L), gfid = c(73099L, 59055L, 73104L, 59067L, 73008L, 59006L,
59111L, 72315L, 72263L, 73174L, 72315L, 72263L, 73104L, 59012L,
73099L, 59058L, 73099L, 59060L, 73104L, 59127L, 72315L), lon = c("75.98381",
"76.6595", "76.029083", "76.662102", "76.016747", "76.691063",
"76.690277", "76.264481", "76.263268", "75.990143", "76.264481",
"76.263268", "76.029083", "76.636169", "75.98381", "76.692299",
"75.98381", "76.699669", "76.029083", "76.628418", "76.264481"
), lat = c("23.019079", "28.881411", "22.873091", "29.01403",
"23.15546", "28.88661", "28.88784", "23.218969", "23.14661",
"22.99415", "23.218969", "23.14661", "22.873091", "29.00535",
"23.019079", "28.88608", "23.019079", "28.879801", "22.873091",
"28.99098", "23.218969"), date = c("08.02.2021", "05.03.2021",
"08.02.2021", "10.03.2021", "03.02.2021", "05.03.2021", "05.03.2021",
"08.02.2021", "08.02.2021", "19.01.2021", "23.02.2021", "23.02.2021",
"13.02.2021", "10.03.2021", "29.01.2021", "05.03.2021", "23.02.2021",
"05.03.2021", "23.02.2021", "10.03.2021", "13.02.2021"), red = c(32L,
40L, 44L, 58L, 32L, 70L, 66L, 76L, 68L, 76L, 76L, 76L, 76L, 84L,
108L, 94L, 90L, 100L, 86L, 108L, 94L), green = c(184L, 216L,
148L, 202L, 104L, 350L, 234L, 260L, 220L, 276L, 220L, 220L, 188L,
196L, 340L, 310L, 226L, 436L, 166L, 316L, 246L), blue = c(1L,
8L, 1L, 2L, 1L, 78L, 26L, 60L, 52L, 28L, 44L, 76L, 44L, 1L, 92L,
70L, 82L, 100L, 46L, 12L, 38L), nir = c(4872L, 4008L, 4328L,
4424L, 2332L, 4856L, 4216L, 4696L, 4200L, 4328L, 4248L, 4040L,
3816L, 4072L, 5176L, 4456L, 4232L, 4680L, 4008L, 5000L, 4344L
), swir = c(1120L, 1184L, 1056L, 1376L, 592L, 1584L, 1200L, 1120L,
1072L, 1136L, 928L, 992L, 1056L, 1440L, 1248L, 1296L, 1040L,
1760L, 928L, 1696L, 1072L), B05 = c(352L, 416L, 288L, 544L, 272L,
672L, 480L, 480L, 416L, 464L, 352L, 416L, 336L, 560L, 544L, 480L,
416L, 928L, 288L, 672L, 416L), B06 = c(2912L, 2528L, 2592L, 3040L,
1488L, 3296L, 2720L, 3104L, 2672L, 2976L, 2464L, 2352L, 2272L,
3088L, 3296L, 2912L, 2416L, 3168L, 2208L, 3568L, 2720L), B07 = c(4640L,
3872L, 4192L, 4448L, 2128L, 4768L, 4000L, 4640L, 3984L, 4336L,
4064L, 3872L, 3808L, 4448L, 4768L, 4256L, 3920L, 3936L, 3808L,
4960L, 4384L), B08A = c(4752L, 3936L, 4384L, 4576L, 2192L, 4832L,
4064L, 4704L, 4128L, 4400L, 4320L, 4064L, 4000L, 4448L, 4960L,
4256L, 4192L, 4176L, 4064L, 5024L, 4512L), B12 = c(464L, 544L,
416L, 608L, 240L, 736L, 544L, 496L, 480L, 464L, 416L, 480L, 480L,
672L, 528L, 608L, 416L, 928L, 416L, 800L, 480L), ndvi = c(0.986949429,
0.980237154, 0.979871912, 0.974118697, 0.972927241, 0.971579374,
0.969173283, 0.968147527, 0.968134957, 0.965485921, 0.964847363,
0.963070942, 0.960945529, 0.959576515, 0.959121877, 0.958681318,
0.958352614, 0.958158995, 0.957987298, 0.95771339, 0.957638575
)), class = "data.frame", row.names = c(NA, -21L))
对于ndvi的任何一个值如果大于0.8如何一步删除值我来澄清一下这个问题我们以区= 72为例,第一行ndvi〉0.8且= 0.98,那么下一个值必须删除,即我们删除0.97987191.下面的值我们不碰,但我们也删除4.即删除经过1个步骤。值仍然是1-3-5,但2-4被依次删除,直到每个地区(组变量)分别结束。好的,输出将是这样的
district_id gfid lon lat date red green blue nir swir B05 B06 B07 B08A B12
1 72 73099 75.98381 23.019079 08.02.2021 32 184 1 4872 1120 352 2912 4640 4752 464
2 72 73104 76.029083 22.873091 08.02.2021 44 148 1 4328 1056 288 2592 4192 4384 416
3 72 73008 76.016747 23.15546 03.02.2021 32 104 1 2332 592 272 1488 2128 2192 240
4 72 72315 76.264481 23.218969 08.02.2021 76 260 60 4696 1120 480 3104 4640 4704 496
5 72 72263 76.263268 23.14661 08.02.2021 68 220 52 4200 1072 416 2672 3984 4128 480
6 72 73174 75.990143 22.99415 19.01.2021 76 276 28 4328 1136 464 2976 4336 4400 464
ndvi
1 0.9869494
2 NA
3 0.9729272
4 NA
5 0.9681350
6 NA
在我们得到所需的输出后,我们需要用2个点之间的平均值替换得到的间隙。将1和3个点的平均值插入第二个点,以此类推。将3和5个点的平均值插入第4个点。
最后,我需要每个district_id
在我们删除值之前和恢复删除值之后的NDVI直方图。
什么是最简单的方法,以消除后的ndvi值1步,然后恢复平均为每个地区分别,也得到直方图之前和之后的价值观为每个地区的删除。
谢谢你的帮助。
1条答案
按热度按时间s6fujrry1#
我认为这是一个组合的减少(例如,
base::Reduce
或purrr::reduce
)和“聚结”(或滑动窗口平均)。我说“减少”是因为你所有的数据都超过了0.8,但你不想要相邻的值(在同一个district_id
中都要转换为NA
),我们需要考虑是否在考虑置零这个值之前将前一个值置零。我将使用
dplyr
进行演示,因为它使分组和操作更容易可视化。这可以转换为base R(或同样容易的data.table
)。首先,整个解决方案,取代了
ndvi
:每个步骤的演练:
这验证了我们在
ndvi2
中每隔一个值为空(因为所有值都超过0.8)。对于求平均值,只要确定不存在其他
NA
值,我们就可以做一个简单的(lag()+lead())/2
求平均值(如果它确实存在,你可以移动到zoo::rollmean
或类似的真正的滑动窗口平均值,并辅以if_else
)。