我正在用一个关于个人的纵向数据库研究R,每个ID有几行(在数据库中命名为vn
(,列中有他们的属性。我的变量observation
表示观察的每一年,maritalstatus
表示该人是否已婚1
或0
。
以下是我的数据库中一个人的概述:
structure(list(vn = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), maritalstatus = c(0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1), observation = c(2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018)), class = "data.frame")
我正在寻找一种方法来创建一个新的变量,该变量只在第一次连续出现的次数长度大于或等于5时计数。例如:
marital_length = c (0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0)
我当前的代码(如下(创建了一个变量,用于计算连续数字的最大长度,但我没有找到添加条件的方法,只计算第一次长度为>= 5
时的长度。
maritalstatus_consecutive <- tapply(test$maritalstatus, INDEX = test$vn, most_consecutive_val)```
test$marital_length <- maritalstatus_consecutive[test$vn]
我也尝试使用min()
(而不是max(,但例如,如果一个人结婚2年,离婚,然后结婚6年,如果我不添加条件>=5
,我将无法在这个新变量中看到她结婚6年。
有人有一个可以帮助我的代码的想法吗?
我不完全确定您的预期输出试图表示什么。如果你只想要第一次婚姻的长度>每个vn
可以使用 5年
tapply(df$maritalstatus, df$vn, function(x) with(rle(x), lengths[lengths >= 5][1]) )
也许这太容易了,但似乎有效:
df$marital_length <- with(df, ave(maritalstatus, vn, FUN = function(x)
with(rle(x), rep(as.integer(seq_along(lengths) ==
which.max(lengths >= 5)) * lengths, lengths))))
df$marital_length
#[1] 0 0 0 0 0 0 5 5 5 5 5 0 0 0 0 0 0 0 0
当长度大于5时,CCD_ 11首次给出索引。