随着时间的推移,我有土地使用的数据,并且正在尝试编写一个逻辑函数,该函数返回观察(这是一小片土地)是否已经从草地变为农田并且在农田中停留。下面是我的数据框中的小样本。
crop2 <- read.table(text="
OBS 2003 2004 2005 2006 2007 2008 changes
494136 Grassland Grassland Grassland Developed Cropland Grassland 2
825726 Developed Developed Developed Grassland Grassland Grassland 1
500019 Forest Forest Forest Forest Forest Grassland 1
587587 Cropland Cropland Cropland Cropland Cropland Cropland 0
524302 Grassland Grassland Cropland Cropland Cropland Cropland 1
158075 Cropland Cropland Cropland Cropland Cropland Cropland 0
",header=TRUE,check.names=FALSE)
在这个数据样本中,函数只返回第二次到最后一次观察,并返回true。我尝试过使用各种函数和if语句,但无法正确编码(部分原因是从农田到草地的过渡可能在任何一年发生。我能够编写这个函数来查找是否确实发生了变化(这是变化变量) )但需要提取更多信息,而不仅仅是是否发生了变化:长度(唯一(as.character(crop2 [x,])))
我的数据框名为crop2,每列都以年份命名。变量是5个级别的因子。 谢谢你的帮助。
答案 0 :(得分:2)
使用rle
:
apply(
crop2[2:7],
1,
function(x) all(tail(rle(x)$values,2) == c("Grassland","Cropland"))
)
#[1] FALSE FALSE FALSE FALSE TRUE FALSE
一个函数apply
- 在子集MARGIN=1
定义的年度数据的每一行(crop2[2:7]
)上。
rle(x)$values
返回土地使用变化的顺序,例如第5行是:
# 2004 2008
#"Grassland" "Cropland"
在tail(...,2)
中包含此内容只会在最后两次使用之间进行更改,在这种情况下再次使用相同的数据:
# 2004 2008
#"Grassland" "Cropland"
all(... = c("Grassland","Cropland"))
位只测试直接来自"Cropland"
后土地使用是否以"Grassland"
结束,在本例中为TRUE