监控测量花费的时间百分比
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
如果您想查看按 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
可以得到长格式的数据,然后计算比例:
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
对于你们中的一些人来说,这可能是一个简单的练习。请在下面查看我正在使用的数据集:
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
如果您想查看按 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
可以得到长格式的数据,然后计算比例:
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