为什么dplyr的transmute函数无法计算两个月度生产力平均值?
问题修正说明
错误原因
- 通过dplyr的
summarize()返回的september_work和october_work是单列数据框(tibble),不是单个数值,直接进行算术运算会存在格式适配问题,需要先提取其中的数值内容。 transmute()函数的作用是基于原数据集的每行数据生成新列,你的需求是计算两个月总工作时长的单值平均值,不需要对原work数据集逐行操作,用法不符合场景。
修正后代码
基于原有逻辑修改版
# Loading Data: work <- structure(list(Case_Number = 30:40, Year = c("2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021"), Month_Number = c("9", "9", "9", "9", "10", "10", "10", "10", "10", "10", "10"), Month_Name = c("September", "September", "September", "September", "October", "October", "October", "October", "October", "October", "October"), Day_Number = c(27L, 28L, 29L, 30L, 1L, 2L, 3L, 4L, 5L, 6L, 7L), Day_Name = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"), Time_Wake = c(600L, 730L, 650L, 830L, 630L, 630L, 830L, 722L, 641L, 800L, 720L), Start_Work = c(950L, 1108L, 1430L, 955L, 1313L, 1125L, 1636L, 1126L, 1027L, 1323L, 1003L), End_Work = c(1504L, 1430L, 1933L, 1335L, 1330L, 2130L, 1636L, 1600L, 1730L, 1800L, 1739L), Mins_Sleep = c(310L, 390L, 350L, 450L, 390L, 390L, 510L, 452L, 310L, 360L, 500L), Workout_Y_N = c("Y", "N", "N", "N", "N", "Y", "Y", "Y", "N", "Y", "Y"), Workout_Before_After = c("Before", NA, NA, NA, NA, "Before", "Before", "Before", NA, "Before", "Before" ), Time_Workout = c(730L, NA, NA, NA, NA, 915L, 1000L, 815L, NA, 900L, 740L), Work_Environment = c("Office", "Office", "Office", "Office", "Home", "Home", "Home", "Office", "Office", "Office", "Office"), Coffee_Cups = c(0L, 0L, 0L, 2L, 0L, 1L, 2L, 3L, 2L, 2L, 4L), Tea_Cups = c(4L, 4L, 4L, 2L, 1L, 0L, 2L, 0L, 0L, 4L, 2L), Mins_Work = c(266L, 196L, 198L, 220L, 17L, 382L, 0L, 180L, 343L, 207L, 263L), Weather = c(NA, NA, "Sunny", "Sunny", NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -11L)) # Calculate Productivity Growth: library(dplyr) september_work <- work %>% filter(Month_Name=="September") %>% summarize(September_Mins = sum(Mins_Work)) %>% pull(September_Mins) # 提取数值,不再返回数据框 october_work <- work %>% filter(Month_Name == "October") %>% summarize(October_Mins = sum(Mins_Work, na.rm = T)) %>% pull(October_Mins) # 提取数值 work_growth <- ((october_work - september_work) / september_work) # calc growth # Create average of work between October and September: avg_month_work <- (september_work + october_work)/2
更简洁的管道流实现(无需单独存储两个月份变量)
avg_month_work <- work %>% group_by(Month_Name) %>% summarise(total_mins = sum(Mins_Work, na.rm = T)) %>% filter(Month_Name %in% c("September", "October")) %>% summarise(avg_month_work = mean(total_mins)) %>% pull(avg_month_work)
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

