R中因子随时间的变化

时间:2014-04-09 22:40:04

标签: r conditional-statements r-factor

随着时间的推移,我有土地使用的数据,并且正在尝试编写一个逻辑函数,该函数返回观察(这是一小片土地)是否已经从草地变为农田并且在农田中停留。下面是我的数据框中的小样本。

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个级别的因子。 谢谢你的帮助。

1 个答案:

答案 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