r - 如何查询具有给定范围内的值的矩阵元素的计数
问题描述
我正在开展一个项目,该项目正在研究森林砍伐事件后树木的再生。为了简化这个问题的数据集,我有一个矩阵(从数据框转换而来),它有 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”。
解决方案
对不起,我的功能可能只处理简单的情况。希望有帮助。首先,您的代码存在一些问题,即当您搜索索引时,您也包含了该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
希望有帮助。
推荐阅读
- css - 如何保存css代码中包含的所有图像?
- reactjs - react-native firebase 检索用户
- google-compute-engine - Google Cloud CoreOS OEM 差异
- android - 颤动的问题溢出
- android - onBackPressed 片段转到另一个片段,而不是在关闭应用程序时
- ruby - Ruby 默认为以前的版本
- laravel - 显示 ERR_TOO_MANY_REDIRECTS 的客户中间件
- c++ - 结构或类中的友元函数
- javascript - 如何将标头传递给获取请求?
- python-3.x - 这个功能(季节)运行时间太长,为什么?以及如何改进代码?