首页 > 解决方案 > 如何计算元素在时间步 t 的出现总数?

问题描述

我是 R 的初学者,但我想编写一段代码,需要一些 R 和数据科学知识。

我有一个具有以下结构的数据框;t1 表示 10 分钟的时间段,1 定义测量值。

 t1 t2 t3 t4
  1  0  0  0
  1  1  1  1
  0  1  1  1
  0  1  1  1
  1  0  1  1

我想确定每次测量的持续时间和起点。例如,有两个从 t1 开始的 10 分钟测量(第 1 行和第 5 行),有两个从 t2 开始的 30 分钟测量(第 3 行和第 4 行)。

输出:

 duration_minutes   t1 t2 t3 t4
      10            2   0  0  0
      20            1   0  1  0
      30            0   2  0  0
      40            1   0  0  0

有没有办法将计数转换为百分比?

df<-structure(list(t1 = c(1, 1, 0, 0,1),
                   t2 = c(0, 1, 1, 1,0), t3 = c(0, 1, 1, 1,1), t4 = c(0, 1, 1,  1,1)), row.names = c(NA,5L), class = "data.frame") 

                                                                                  

标签: rdataframe

解决方案


我首先将数据转换为长格式,然后计算连续的 1 以确定每次测量的持续时间,从而解决了这个问题。然后我计算每个持续时间在每个开始时间出现的频率,并返回到更广泛的格式以获得您描述的输出(我没有找到 t4 列,因为它没有任何新的测量值):

library(tidyr)
library(dplyr)

df %>% 
  mutate(rownr = 1:nrow(.)) %>% 
  pivot_longer(names_to = 'time', values_to = 'value', cols = 1:4) %>% 
  group_by(rownr, grp = cumsum(value == 0)) %>% 
  mutate(duration = 10 * cumsum(value)) %>% 
  filter(duration != 0) %>% 
  summarise(time = first(time), 
            duration = max(duration)) %>% 
  group_by(time, duration) %>% 
  count() %>% 
  pivot_wider(names_from = time, values_from = n, values_fill = 0) %>% 
  arrange(duration)

推荐阅读