【问题标题】:Monitor the percentage of time spent on measurements监控花费在测量上的时间百分比
【发布时间】:2020-11-26 13:34:00
【问题描述】:

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

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

【问题讨论】:

  • 你是怎么想出号码1-75%; 2-25%等的?你能解释一下计算吗?
  • @RonakShah 非常感谢我假设在 d1t1 期间有 4 人报告了测量结果。基于此,我计算出 4 人中 75% 的人报告了第 1 次测量,剩下的 25% 是 1 人报告第 2 次测量的结果。
  • @RonakShah 也许需要插入一个新变量来报告病例数?

标签: r dataframe percentage


【解决方案1】:

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

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

【讨论】:

  • 非常感谢它不知道地图功能;如何将结果保存在数据框中并绘制该数据框(使用 x 轴时间步长和 y 轴百分比)?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多