【问题标题】:Using R to count consecutive occurrences of a number and how long each occurrence lasts for?使用 R 计算一个数字的连续出现次数以及每次出现持续多长时间?
【发布时间】:2020-05-30 10:01:21
【问题描述】:

我有一个大型数据集 (dt),它有一个时间列(时间以秒为单位)和一个列,当其他一些变量满足某个值时记录为 1,当它们不满足时记录为 0,例如:

time (s) var
0        1   
0.3      1
0.6      0
0.9      0
1.2      1
1.5      1
1.8      0

第 1 部分)我想要做的是每次在计数列中重复 1 作为唯一出现(超过两次)时计数,如下所示:

time (s) var count
0        1   1
0.3      1   1
0.6      0   0
0.9      0   0
1.2      1   2
1.5      1   2
1.8      0   0

在同一回合中的每次出现都将具有相同的数字,而出现 0 的地方则没有计数。

对于第 1 部分,到目前为止我已经有了这个,但我希望它能够将每个唯一出现的次数打印为一列中的计数,而它不会这样做:

with(rle(dt$var), sum(lengths[values] > 2))

第 2 部分)我还想知道每次出现持续的时间长度。 (我还有一个复制列,每行的值为 1)

我试过这个来计算第 2 部分,但它不起作用......

var_time <- dt %>%
  group_by(replicate) %>%
  mutate(var_time = cumsum(var != lag(var, default = ""))) %>%
  group_by(var, time) %>%
  summarise(start = min(time),
            end   = max(time),
            var = sum(var))

【问题讨论】:

  • 请使用dput 添加数据并显示相同的预期输出。请阅读有关how to ask a good question 的信息以及如何提供reproducible example。此外,每个帖子最好只问一个问题。
  • 我觉得这个数据集实在是太大了,上传不了,有50多列500000行..

标签: r dplyr count


【解决方案1】:

您可以使用rle 获得第一部分的答案。

dt$count <- with(rle(dt$var), rep(values * cumsum(values & lengths >= 2),lengths))

dt
#  time var count
#1  0.0   1     1
#2  0.3   1     1
#3  0.6   0     0
#4  0.9   0     0
#5  1.2   1     2
#6  1.5   1     2
#7  1.8   0     0

【讨论】:

  • 它可以工作,但由于某种原因,它仍然可以识别数据集中小于 2 的值 - 它不会标记它们,但它会计算它们,然后是连续超过 2 的下一个数字它将被视为一个数字。
  • 是的,你是对的。我更新了答案以纠正它。你现在可以检查吗?
【解决方案2】:

data.table 的选项

library(data.table)
setDT(df1)[, count := rleid(var) * var][count != 0, 
     count := match(count, unique(count))][]
#     time var count
#1:  0.0   1     1
#2:  0.3   1     1
#3:  0.6   0     0
#4:  0.9   0     0
#5:  1.2   1     2
#6:  1.5   1     2
#7:  1.8   0     0

或与base R 一起使用rle/inverse.rle

df1$count <- inverse.rle(within.list(rle(df1$var), 
      values[as.logical(values)] <- seq_along(values[as.logical(values)])))

数据

df1 <- data.frame(time = c(0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8), var = c(1, 1, 0, 0, 1, 1, 0))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多