【问题标题】:Using rle() for indexing data.frame - how to show zero's in the function to maintain the same vector length?使用 rle() 索引 data.frame - 如何在函数中显示零以保持相同的向量长度?
【发布时间】:2019-01-22 10:58:29
【问题描述】:

在下面的示例中,我的目标是显示在 5 连续实例中,df 转换为 df_new 的连续数字低于 threshold-1.2 的年份。然后我想从列 df_new$year 返回相应的唯一值作为结果。我链接rle() 函数结果的问题是长度与df_new$year 长度不对应,因此我无法正确索引它。 rle() 函数的问题在于它不返回零,因此它只返回比 k 中的 threshold 低至少 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 1978 1979 1980 1982 1984 1985

我希望它是什么:

> years
    [1] 1976 1980 1983 1985

【问题讨论】:

  • 问题只是关于代码的最后两行(或多或少)?如果是这样,您能否修改您的问题,发布df_new$valuedf_new$year 并根据输入显示预期输出?
  • @markus 我修改了问题以使其更清晰,但保留可重现的 df 原样
  • 关于rle 输出和df_new$year 的长度 - 这有帮助吗:stackoverflow.com/questions/54072409/…

标签: r dataframe run-length-encoding


【解决方案1】:

这很丑,但它有效:)

df_new$year[cumsum(k$lengths)[which(k$lengths >= 5)-1]+1]

各部分:

idx &lt;- which(k$lengths &gt;= 5)-1 在值大于或等于 4 之前为您提供 k$lengths 的索引。

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

将此结果加 1 为我们提供了每个序列开始的行的索引。

【讨论】:

  • 伟大的@Martin Schmelzer!你能解释一下它为什么有效吗??
  • 这就够了吗? :)
猜你喜欢
  • 2018-03-03
  • 2015-10-02
  • 2018-06-25
  • 1970-01-01
  • 2017-08-20
  • 2021-11-03
  • 2022-06-17
  • 2021-08-17
  • 1970-01-01
相关资源
最近更新 更多