Как сделать запросы на количество элементов матрицы со значениями в заданном диапазоне - PullRequest
0 голосов
/ 10 апреля 2019

Я работаю над проектом, который рассматривает рост деревьев после вырубки леса. Чтобы упростить набор данных для этого вопроса, у меня есть матрица (преобразованная из фрейма данных), которая имеет 10 столбцов, соответствующих 2001–2010 годам.

-1 указывает точку изменения в данных, когда ранее высаженный лесом участок был обезлесен. 1 указывает, когда ранее обезлесенный район стал лесным. 0 указывают на отсутствие изменений в состоянии.

Я нашел эту ссылку, которая, я думаю, делает то, что мне нужно, за исключением python / c ++. Поскольку я провел остальные анализы в R, я хочу придерживаться этого.

Итак, я пытался перевести часть кода на R, но у меня были проблемы.

Это мой пример набора данных. Одна из моих альтернативных мыслей заключается в том, что если бы я мог определить индекс (-1), а затем индекс 1, то я мог бы вычесть эти два индекса, чтобы получить разницу (а затем вычесть 1, чтобы учесть факторинг в первом индексе в вычитание)

# Example data
head(tcc_change)

  id   2001  2002  2003  2004  2005  2006  2007  2008 2009  2010  
1  1      0     0     0     0     0    -1     0     0    1    0   
2  2      0     0     0    -1     0     0     1     0    0    0     
3  3      0     0     0    -1     0     0     0     1    0    0  
4  4      0    -1     0     0     0     0     1     0    0    0   
5  5      0     0     0     1     0     0    -1     1    0    0 

# Indexing attempt
tcc_change$loss_init <- apply(tcc_change, 1, function(x) match(-1, x[1:10], nomatch = 99)) 
tcc_change$gain <- apply(tcc_change, 1, function(x) match(1, x[1:10], nomatch=99))

У этого метода много проблем. Что, если перед 1 (например, 1) стоит 1? Я хотел бы найти лучший способ сделать этот анализ, похожий на логическую структуру в ссылке выше, но я не знаю, как это сделать в R.

В идеале я хотел бы определить точки, в которых произошло вырубка леса (-1), а затем снова вырасти (1), а затем посчитать нули между ними. Количество нулей между ними будет размещено в новом столбце. Это дало бы мне лучшее представление о том, сколько времени потребуется для того, чтобы участок стал покрыт лесом после вырубки леса. Если между ними нет нулей (например, строка 5), я бы хотел, чтобы код вывел «0».

1 Ответ

0 голосов
/ 11 апреля 2019

Извините, моя функция может работать только в простом случае.Надеюсь, это поможет.Во-первых, у вашего кода есть некоторые проблемы: при поиске по индексу вы также включаете столбец idx[1:10]).если вы хотите исключить это, можете использовать x[-1] для исключения первого столбца, но индекс будет считаться от 2-го.

tcc_change$loss_init <- apply(tcc_change, 1, function(x) match(-1, x[1:10], nomatch = 99)) 
tcc_change$gain <- apply(tcc_change, 1, function(x) match(1, x[1:10], nomatch=99))

Я изменил ваш подход и сначала получил индекс -1, затем снова использовал match для поиска индекса 1, начиная с индекса -1;затем, как только я обнаружил, что может просто минус 1, чтобы получить количество интервалов:

get_interval = function(x){
  init = match(-1, x[-1])
  interval = match(1, x[-(1:(init+1))]) - 1
  return(interval)
}

> apply(tcc_change, 1, get_interval)
[1] 2 2 3 4 0

Надеюсь, что помогает.

...