R:转换检测的自动化
R: Automatization of transition detections
我的数据集需要一些帮助,我必须在其中检测随时间的转变。我想我可以用 if_else
语句构建一些东西,但它可能会很长很复杂。我确定有捷径。
我的数据集如下所示:
df <- tibble ("FID" = c(1,2,3,4,5),
"CCSC87"= c(NA, NA,"Boscos d'aciculifolis", NA, "Boscos de caducifolis"),
"CCSC92"= c(NA,"Boscos d'aciculifolis","Matollars",NA,"Bosquines i prats"),
"CCSC97"= c(NA,"Zones cremades", "Matollars","Boscos d'aciculifolis","Bosquines i prats"),
"CCSC02"= c(NA,"Matollars", "Matollars", "Matollars", "Bosquines i prats"),
"CCSC07"= c("Boscos d'escleròfil·les","Boscos d'aciculifolis", NA,"Matollars",NA),
"CCSC12"= c("Matollars",NA,NA,"Boscos d'escleròfil·les",NA),
"CCSC17"= c("Bosquines i prats",NA,NA,NA,NA),
"CCSC20"= c("Boscos d'escleròfil·les", NA, NA,NA,NA))
> df
# A tibble: 5 x 9
FID CCSC87 CCSC92 CCSC97 CCSC02 CCSC07 CCSC12 CCSC17 CCSC20
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 NA NA NA NA Boscos d'escler… Matollars Bosquines i… Boscos d'escler…
2 2 NA Boscos d'acicul… Zones cremades Matollars Boscos d'acicul… NA NA NA
3 3 Boscos d'acicul… Matollars Matollars Matollars NA NA NA NA
4 4 NA NA Boscos d'acicul… Matollars Matollars Boscos d'escler… NA NA
5 5 Boscos de caduc… Bosquines i pra… Bosquines i pra… Bosquines i… NA NA NA NA
如您所见,我有不同的列,它们是土地覆盖分类,分别是 1987 年、1992 年、1997 年、2002 年、2007 年、2012 年、2017 年和 2020 年。
对于每个地块 (FID=1,2
...) 我有来自土地覆盖的 4 列的数据,其他列都填充了 NA's
。
为了简化,我的数据也可以像这样可视化:
df <- tibble ("FID" = c(1,2,3,4,5),
"CCSC87"= c(NA, NA,"A", NA, "C"),
"CCSC92"= c(NA,"A","E",NA,"F"),
"CCSC97"= c(NA,"D", "E","A","F"),
"CCSC02"= c(NA,"E", "E", "E", "F"),
"CCSC07"= c("B","A", NA,"E",NA),
"CCSC12"= c("E",NA,NA,"B",NA),
"CCSC17"= c("F",NA,NA,NA,NA),
"CCSC20"= c("B", NA, NA,NA,NA))
> df
# A tibble: 5 x 9
FID CCSC87 CCSC92 CCSC97 CCSC02 CCSC07 CCSC12 CCSC17 CCSC20
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 NA NA NA NA B E F B
2 2 NA A D E A NA NA NA
3 3 A E E E NA NA NA NA
4 4 NA NA A E E B NA NA
5 5 C F F F NA NA NA NA
我需要计算一个额外的列,告诉我土地覆盖从我有数据的第一年到去年是否发生了变化。例如,在 FID=1
中,我想检查 CCSC07
和 CCSC20
是否不同以及它们是否是什么过渡。
我的输出应该是这样的:
> df_done
# A tibble: 5 x 10
FID CCSC87 CCSC92 CCSC97 CCSC02 CCSC07 CCSC12 CCSC17 CCSC20 Transition
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 NA NA NA NA B E F B B
2 2 NA A D E A NA NA NA A
3 3 A E E E NA NA NA NA AtoE
4 4 NA NA A E E B NA NA AtoB
5 5 C F F F NA NA NA NA CtoF
我们可以按行使用 apply
,获取非 NA 值,比较每行中的第一个和最后一个值,如果它们不同,则 paste
它们。
apply(df[-1], 1, function(x) {
x <- na.omit(x)
if(x[1] != x[length(x)])
paste(x[1], x[length(x)], sep = 'to')
else x[1]
})
#[1] "B" "A" "AtoE" "AtoB" "CtoF"
我的数据集需要一些帮助,我必须在其中检测随时间的转变。我想我可以用 if_else
语句构建一些东西,但它可能会很长很复杂。我确定有捷径。
我的数据集如下所示:
df <- tibble ("FID" = c(1,2,3,4,5),
"CCSC87"= c(NA, NA,"Boscos d'aciculifolis", NA, "Boscos de caducifolis"),
"CCSC92"= c(NA,"Boscos d'aciculifolis","Matollars",NA,"Bosquines i prats"),
"CCSC97"= c(NA,"Zones cremades", "Matollars","Boscos d'aciculifolis","Bosquines i prats"),
"CCSC02"= c(NA,"Matollars", "Matollars", "Matollars", "Bosquines i prats"),
"CCSC07"= c("Boscos d'escleròfil·les","Boscos d'aciculifolis", NA,"Matollars",NA),
"CCSC12"= c("Matollars",NA,NA,"Boscos d'escleròfil·les",NA),
"CCSC17"= c("Bosquines i prats",NA,NA,NA,NA),
"CCSC20"= c("Boscos d'escleròfil·les", NA, NA,NA,NA))
> df
# A tibble: 5 x 9
FID CCSC87 CCSC92 CCSC97 CCSC02 CCSC07 CCSC12 CCSC17 CCSC20
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 NA NA NA NA Boscos d'escler… Matollars Bosquines i… Boscos d'escler…
2 2 NA Boscos d'acicul… Zones cremades Matollars Boscos d'acicul… NA NA NA
3 3 Boscos d'acicul… Matollars Matollars Matollars NA NA NA NA
4 4 NA NA Boscos d'acicul… Matollars Matollars Boscos d'escler… NA NA
5 5 Boscos de caduc… Bosquines i pra… Bosquines i pra… Bosquines i… NA NA NA NA
如您所见,我有不同的列,它们是土地覆盖分类,分别是 1987 年、1992 年、1997 年、2002 年、2007 年、2012 年、2017 年和 2020 年。
对于每个地块 (FID=1,2
...) 我有来自土地覆盖的 4 列的数据,其他列都填充了 NA's
。
为了简化,我的数据也可以像这样可视化:
df <- tibble ("FID" = c(1,2,3,4,5),
"CCSC87"= c(NA, NA,"A", NA, "C"),
"CCSC92"= c(NA,"A","E",NA,"F"),
"CCSC97"= c(NA,"D", "E","A","F"),
"CCSC02"= c(NA,"E", "E", "E", "F"),
"CCSC07"= c("B","A", NA,"E",NA),
"CCSC12"= c("E",NA,NA,"B",NA),
"CCSC17"= c("F",NA,NA,NA,NA),
"CCSC20"= c("B", NA, NA,NA,NA))
> df
# A tibble: 5 x 9
FID CCSC87 CCSC92 CCSC97 CCSC02 CCSC07 CCSC12 CCSC17 CCSC20
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 NA NA NA NA B E F B
2 2 NA A D E A NA NA NA
3 3 A E E E NA NA NA NA
4 4 NA NA A E E B NA NA
5 5 C F F F NA NA NA NA
我需要计算一个额外的列,告诉我土地覆盖从我有数据的第一年到去年是否发生了变化。例如,在 FID=1
中,我想检查 CCSC07
和 CCSC20
是否不同以及它们是否是什么过渡。
我的输出应该是这样的:
> df_done
# A tibble: 5 x 10
FID CCSC87 CCSC92 CCSC97 CCSC02 CCSC07 CCSC12 CCSC17 CCSC20 Transition
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 NA NA NA NA B E F B B
2 2 NA A D E A NA NA NA A
3 3 A E E E NA NA NA NA AtoE
4 4 NA NA A E E B NA NA AtoB
5 5 C F F F NA NA NA NA CtoF
我们可以按行使用 apply
,获取非 NA 值,比较每行中的第一个和最后一个值,如果它们不同,则 paste
它们。
apply(df[-1], 1, function(x) {
x <- na.omit(x)
if(x[1] != x[length(x)])
paste(x[1], x[length(x)], sep = 'to')
else x[1]
})
#[1] "B" "A" "AtoE" "AtoB" "CtoF"