使用rle()索引data.frame-如何显示零和x27;在函数中保持相同的向量长度?

使用rle()索引data.frame-如何显示零和x27;在函数中保持相同的向量长度?,r,dataframe,run-length-encoding,R,Dataframe,Run Length Encoding,在下面的示例中,我的目标是显示在df中转换为df_new的连续数字在5连续实例中低于阈值-1.2的年份。然后我想从df_new$year列返回相应的唯一值作为结果。我在链接rle()函数结果时遇到的问题是,长度与df_new$year长度不对应,因此我无法正确索引它。rle()函数的问题在于它不返回零,因此它只返回k中低于阈值的至少1次运行。如何改进这段代码以实现我需要的功能?有没有办法强迫rle()在k中包含零,或者我应该使用另一种方法 # Example reproducible df: s

在下面的示例中,我的目标是显示在
df
中转换为
df_new
的连续数字在
5
连续实例中低于
阈值
-1.2
的年份。然后我想从
df_new$year
列返回相应的唯一值作为结果。我在链接
rle()
函数结果时遇到的问题是,长度与
df_new$year
长度不对应,因此我无法正确索引它。
rle()
函数的问题在于它不返回零,因此它只返回
k
中低于
阈值的至少1次运行。如何改进这段代码以实现我需要的功能?有没有办法强迫rle()在
k
中包含零,或者我应该使用另一种方法

# Example reproducible df:
set.seed(125)
df <- data.frame(V1=rnorm(10,-1.5,.5),
                 V2=rnorm(10,-1.5,.5),
                 V3=rnorm(10,-1.5,.5),
                 V4=rnorm(10,-1.5,.5),
                 V5=rnorm(10,-1.5,.5),
                 V6=rnorm(10,-1.5,.5),
                 V7=rnorm(10,-1.5,.5),
                 V8=rnorm(10,-1.5,.5),
                 V9=rnorm(10,-1.5,.5),
                 V10=rnorm(10,-1.5,.5))
library(data.table)
df_t <- t(df)
df_long <- melt(df_t)
df_long$year <- rep(1976:1985, each=nrow(df))
df_new <- data.frame(value=df_long$value,year=df_long$year)

# Threshold values:
 threshold = -1.2
    consecutiveentries = 5
    number <- consecutiveentries-1
# Start of the problem:
    k <- rle(df_new$value < threshold)
    years <- unique(df_new$year[k$lengths > number])
我想要的是:

> years
    [1] 1976 1980 1983 1985

这很难看,但很管用:)

每个部分:

idx=5)-1
在值大于或等于4之前提供
k$length
的索引

使用
cumsum(k$length)
我们然后在
k$length
上构建累积和,并在
idx
处获取元素。因此,我们得到了在
>=5序列的第一行之前出现的行数


将1添加到这个结果中,我们可以得到每个序列开始的行的索引。

问题是否仅限于代码的最后两行(多多少少)?如果是这样,您能否修改您的问题,发布
df_new$value
df_new$year
,并根据输入显示预期输出?@markus I修改了问题,使其更加清晰,但是将可复制的df保留为关于
rle
输出长度和
df_new$year
-这有帮助吗:Great@Martin Schmelzer!你能解释一下它为什么有效吗?这足够了吗
> years
    [1] 1976 1980 1983 1985
df_new$year[cumsum(k$lengths)[which(k$lengths >= 5)-1]+1]