使用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]