R: Автоматизация обнаружения переходов - PullRequest
0 голосов
/ 06 апреля 2020

Мне нужна помощь с моим набором данных, где я должен обнаружить переход во времени. Я думаю, что могу что-то построить с 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    

Как вы видите, у меня есть разные столбцы, которые являются классификациями Land Cover, с 1987, 1992, 1997, 2002 , 2007, 2012, 2017 и 2020.

Для каждого участка (FID=1,2 ...) у меня есть данные из 4 столбцов Land Cover, а остальные столбцы заполнены 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

1 Ответ

1 голос
/ 06 апреля 2020

Мы можем использовать 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...