Отслеживайте процент времени, затрачиваемого на измерения - PullRequest
2 голосов
/ 06 августа 2020

Для некоторых из вас это может быть легкое упражнение. См. Ниже набор данных, с которым я работаю:

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 = различные типы измерений

Я хотел бы подсчитать процент времени, затрачиваемого на измерения каждый день в один и тот же момент времени. Но я не знаю, как это сделать. Я попытался отформатировать свои данные от широкого к длинному, но я не знаю, как вернуть проценты для измерений, основанных на разных временных шагах.

Вывод:

    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")

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Если вам нужен вывод фрейма данных, вы можете попробовать

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

Если вы хотите увидеть проценты, сгруппированные по t1, t2 и t3, вы можете попробовать

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
2 голосов
/ 06 августа 2020

Вы можете получить данные в длинном формате и затем вычислить пропорцию:

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
...