监控测量花费的时间百分比

Monitor the percentage of time spent on measurements

对于你们中的一些人来说,这可能是一个简单的练习。请在下面查看我正在使用的数据集:

d1t1 d1t2 d1t3 d1t4 d2t1 d2t2 d2t3 d2t4
 1     1    1   2    1    1    1    2
 2     2    0   5    1    2    0    2
 1     2    0   7    1    2    1    2
 1     1    0   7    1    2    1    2

变量的简短说明:

d1t1=Day 1 time 1
d1t2=Day 1 time 2
....
d2t1=Day2 time 1
d2t2=Day2 time 2

0,1,2,5,7 = 不同类型的测量值

我想计算每天同一时刻花在测量上的时间百分比。但我不知道如何尝试将数据从宽到长格式化,但我不知道如何 return 基于不同时间步长的测量百分比。

输出:

    t1
d1: 1-75%; 2-25% # considering that during d1t1 4 people took measurements 
d2: 1-100%;
   
   t2
d1: 1-50%; 2-50%
d2: 1-50%; 2-50%

示例数据:

df<-structure(list(d1t1 = c(1, 2, 1, 1),
                   d1t2 = c(1, 2, 2, 1), d1t3 = c(1, 0, 0, 0), d1t4 = c(2, 5, 7,  7),
                   d2t1 = c(1, 1, 1, 1), d2t2 = c(1, 2, 2, 2), d2t3 = c(1, 0, 1 ,1), d2t4=c(2,2,2,2)), row.names = c(NA,
                                                                                           4L), class = "data.frame")

如果你正在寻找数据帧输出,你可以尝试

dfout <- with(
  aggregate(cnt ~ ., cbind(stack(df), cnt = 1), sum),
  perc <- 100 * cnt / ave(cnt, gsub("t\d+", "", ind), gsub("d\d+", "", ind), FUN = sum)
)

这样

   values  ind cnt perc
1       1 d1t1   3   75
2       2 d1t1   1   25
3       1 d1t2   2   50
4       2 d1t2   2   50
5       0 d1t3   3   75
6       1 d1t3   1   25
7       2 d1t4   1   25
8       5 d1t4   1   25
9       7 d1t4   2   50
10      1 d2t1   4  100
11      1 d2t2   1   25
12      2 d2t2   3   75
13      0 d2t3   1   25
14      1 d2t3   3   75
15      2 d2t4   4  100

如果你想将输出保存在列表中,你可以尝试prop.table如下

Map(function(x) prop.table(table(unname(x))),df)

这样

> Map(function(x) prop.table(table(unname(x))),df)
$d1t1

   1    2 
0.75 0.25

$d1t2

  1   2
0.5 0.5

$d1t3

   0    1
0.75 0.25

$d1t4

   2    5    7
0.25 0.25 0.50 

$d2t1

1
1

$d2t2

   1    2
0.25 0.75

$d2t3

   0    1
0.25 0.75

$d2t4

2
1


如果您想查看按 t1t2t3 分组的百分比,您可以尝试

Map(
  function(x) {
    Map(
      function(v) prop.table(table(unname(v))),
      x
    )
  },
  split.default(df, gsub(".*(t\d+)", "\1", names(df)))
)

这样

$t1
$t1$d1t1

   1    2
0.75 0.25

$t1$d2t1

1
1


$t2
$t2$d1t2

  1   2
0.5 0.5

$t2$d2t2

   1    2
0.25 0.75


$t3
$t3$d1t3

   0    1
0.75 0.25

$t3$d2t3

   0    1
0.25 0.75


$t4
$t4$d1t4

   2    5    7
0.25 0.25 0.50

$t4$d2t4

2
1

可以得到长格式的数据,然后计算比例:

library(dplyr)

df %>%
   tidyr::pivot_longer(cols = everything(),
                       names_to = c('day', 'time'), 
                       names_pattern = '(d\d+)(t\d+)') %>%
   count(day, time, value) %>%
   group_by(time, day) %>%
   mutate(n = n/sum(n) * 100)


#   day   time  value     n
#   <chr> <chr> <dbl> <dbl>
# 1 d1    t1        1    75
# 2 d1    t1        2    25
# 3 d1    t2        1    50
# 4 d1    t2        2    50
# 5 d1    t3        0    75
# 6 d1    t3        1    25
# 7 d1    t4        2    25
# 8 d1    t4        5    25
# 9 d1    t4        7    50
#10 d2    t1        1   100
#11 d2    t2        1    25
#12 d2    t2        2    75
#13 d2    t3        0    25
#14 d2    t3        1    75
#15 d2    t4        2   100