Я работаю над проектом, который рассматривает отрастание деревьев после обезлесения. Чтобы упростить набор данных для этого вопроса, у меня есть матрица (преобразованная из фрейма данных), которая имеет 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. Я хотел бы найти лучший способ сделать этот анализ, похожий на логическую структуру в приведенной выше ссылке, но я не знаю, как это сделать в R.
В идеале я хотел бы определить точки, где была вырубка леса (-1), а затем отрастание (1), а затем подсчитать нули между ними. Количество нулей между ними будет отправлено в новый столбец. Это дало бы мне лучшее представление о том, сколько времени требуется, чтобы участок стал лесным после вырубки леса. Если между ними нет нулей (например, строка 5), я бы хотел, чтобы код выводил «0».
Спасибо! Это вообще работает для меня. Однако у меня есть один вопрос: что, если есть более одного события потери/прибыли? Например [0,0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0]. Я мог видеть, что метод индексации не может справиться с этим, это правильно?
хорошая точка зрения. Это также зависит от того, как вы собираетесь справляться с такой ситуацией, например, хотите ли вы суммировать эти интервалы или взять максимум? Я могу думать только о том, как справиться с простым случаем, и перечислю ниже.
Спасибо большое за Ваш ответ! Это отличное начало, и я ценю, что вы предоставили функцию, которая работает в большинстве случаев для меня!
Извините, моя функция может обрабатывать только простой случай. Надеюсь, это поможет.
Во-первых, в вашем коде есть некоторые проблемы, связанные с тем, что при поиске по индексу вы также включаете столбец id
(в x[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
Надеюсь, это поможет.
Можете ли вы просто использовать
gain - loss_init -1
? еслиgain
стоит передloss_init
, то установить0
?ifelse(gain > loss_init, gain-loss_init-1, 0)