首页 > 解决方案 > 如何查询具有给定范围内的值的矩阵元素的计数

问题描述

我正在开展一个项目,该项目正在研究森林砍伐事件后树木的再生。为了简化这个问题的数据集,我有一个矩阵(从数据框转换而来),它有 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”。

标签: rindexingquerying

解决方案


对不起,我的功能可能只处理简单的情况。希望有帮助。首先,您的代码存在一些问题,即当您搜索索引时,您也包含了该id列(在 中x[1:10])。如果要排除它,可以使用x[-1]排除第一列,但索引将从第二列开始计算。

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

希望有帮助。


推荐阅读