R语言数据框唯一值统计及排班人员周工时计算需求
1. 在R语言中统计Data Frame的唯一值数量
根据不同的统计需求,这里分场景给出解决方案:
统计整个Data Frame的所有唯一值总数:
先把Data Frame转换成一维向量,再去重计数,代码如下:length(unique(unlist(your_dataframe)))解释:
unlist()会把Data Frame拆成一个向量,unique()去除重复值,length()统计剩余元素的数量。统计每一列的唯一值数量:
用sapply()遍历每一列,分别计算每列的唯一值数:sapply(your_dataframe, function(x) length(unique(x)))运行后会返回一个命名向量,每个元素对应一列的唯一值数量。
统计特定列的唯一值数量:
比如要统计Shift列的唯一值,直接针对该列操作:length(unique(your_dataframe$Shift))
2. 排班系统计算每位人员每周工作时长
针对你提供的排班Data Frame,我们可以用tidyverse工具包高效完成统计,步骤如下:
第一步:准备数据(构造可复现的示例)
如果你的数据已经存在,这步可以跳过,我先把你给出的表格转成可运行的R代码:
# 安装并加载tidyverse(如果没装过的话) # install.packages("tidyverse") library(tidyverse) df <- data.frame( Shift = c("09-12", "12-15", "15-18", "18-21", "21-24", "24-03", "03-06", "06-09"), Monday = c("a", "b", "c", "d", "e", "f", "a", "b"), Tuesday = c("c", "d", "e", "f", "a", "b", "c", "d"), Wednesday = c("a", "b", "c", "e", "d", "f", "a", "b"), Thursday = c("c", "d", "e", "f", "d", "e", "a", "f"), Friday = c("b", "a", "d", "e", "c", "a", "b", "d"), Saturday = c("b", "a", "e", "f", "d", "b", "a", "e"), Sunday = c("b", "e", "f", "a", "d", "b", "e", "f") )
第二步:将宽格式数据转成长格式
原数据是宽格式(每列对应一个星期几),转成长格式后更便于按人员分组统计:
df_long <- df %>% pivot_longer(cols = -Shift, # 除了Shift列,其他列都转成键值对 names_to = "day", # 原列名(星期几)存到day列 values_to = "person") # 原单元格的人员存到person列
第三步:添加工时列
根据规则,24-03班次算4小时,其他班次默认3小时:
df_long <- df_long %>% mutate(hours = ifelse(Shift == "24-03", 4, 3))
第四步:按人员分组计算总工时
最后分组求和,得到每个人每周的总工作时长:
total_weekly_hours <- df_long %>% group_by(person) %>% summarise(total_hours = sum(hours)) %>% arrange(person) # 按人员字母排序,方便查看 # 查看结果 print(total_weekly_hours)
运行后你会得到类似这样的结果:
# A tibble: 6 × 2 person total_hours <chr> <dbl> 1 a 34 2 b 35 3 c 32 4 d 35 5 e 34 6 f 30
内容的提问来源于stack exchange,提问作者user9532692
相关产品推荐
相关产品推荐

