如何查询给定范围内值的矩阵元素的计数
How to do queries for counts of matrix elements with values in given range
我正在从事一个项目,该项目正在研究森林砍伐事件后树木的再生情况。为了简化这个问题的数据集,我有一个矩阵(从数据框转换而来),它有 10 列对应于 2001-2010 年。
-1 表示数据中的一个变化点,即先前森林覆盖的地块被砍伐。 1 表示先前砍伐森林的地区何时变成了森林。 0 表示状态没有变化。
我发现 this link 我认为它可以满足我的需要,但 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 会怎样。我想找出一个更好的方法来做这个分析,类似于上面link中的逻辑结构,但我不知道如何在R中做到这一点。
理想情况下,我想确定有森林砍伐 (-1) 和再生 (1) 的点,然后计算中间的零点。介于两者之间的零的数量将发布到新列中。这会让我更好地了解在森林砍伐事件后一块地块变成森林需要多长时间。如果中间没有零(如第 5 行),我希望代码输出“0”。
抱歉,我的函数可能只处理简单的情况。希望有所帮助。
首先,您的代码存在一些问题,当您搜索索引时,您还包括 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
希望对您有所帮助。
我正在从事一个项目,该项目正在研究森林砍伐事件后树木的再生情况。为了简化这个问题的数据集,我有一个矩阵(从数据框转换而来),它有 10 列对应于 2001-2010 年。
-1 表示数据中的一个变化点,即先前森林覆盖的地块被砍伐。 1 表示先前砍伐森林的地区何时变成了森林。 0 表示状态没有变化。
我发现 this link 我认为它可以满足我的需要,但 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 会怎样。我想找出一个更好的方法来做这个分析,类似于上面link中的逻辑结构,但我不知道如何在R中做到这一点。
理想情况下,我想确定有森林砍伐 (-1) 和再生 (1) 的点,然后计算中间的零点。介于两者之间的零的数量将发布到新列中。这会让我更好地了解在森林砍伐事件后一块地块变成森林需要多长时间。如果中间没有零(如第 5 行),我希望代码输出“0”。
抱歉,我的函数可能只处理简单的情况。希望有所帮助。
首先,您的代码存在一些问题,当您搜索索引时,您还包括 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
希望对您有所帮助。