Как выполнять запросы для подсчета элементов матрицы со значениями в заданном диапазоне

Я работаю над проектом, который рассматривает отрастание деревьев после обезлесения. Чтобы упростить набор данных для этого вопроса, у меня есть матрица (преобразованная из фрейма данных), которая имеет 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».

Можете ли вы просто использовать gain - loss_init -1? если gain стоит перед loss_init, то установить 0? ifelse(gain > loss_init, gain-loss_init-1, 0)

liuminzhao 10.04.2019 16:50

Спасибо! Это вообще работает для меня. Однако у меня есть один вопрос: что, если есть более одного события потери/прибыли? Например [0,0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0]. Я мог видеть, что метод индексации не может справиться с этим, это правильно?

kkalina 10.04.2019 17:28

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

liuminzhao 11.04.2019 05:12

Спасибо большое за Ваш ответ! Это отличное начало, и я ценю, что вы предоставили функцию, которая работает в большинстве случаев для меня!

kkalina 11.04.2019 15:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Извините, моя функция может обрабатывать только простой случай. Надеюсь, это поможет. Во-первых, в вашем коде есть некоторые проблемы, связанные с тем, что при поиске по индексу вы также включаете столбец 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

Надеюсь, это поможет.

Другие вопросы по теме