R语言实现按交付年份移位行数据及故障占比计算
R语言实现方案
1. 故障年份移位功能实现
优先推荐tidyverse生态的实现方案,逻辑清晰易维护:
# 加载依赖包 library(dplyr) library(tidyr) library(stringr) # 测试数据 data <- data.frame( `Delivery Year` = c('1976','1977','1978','1979'), `Freq` = c(120,100,80,60), `Year.1976` = c(10,NA,NA,NA), `Year.1977` = c(5,3,NA,NA), `Year.1978` = c(10,NA,8,NA), `Year.1979` = c(13,10,5,14), check.names = FALSE ) # 移位处理代码 result <- data %>% # 故障年份列转为长格式 pivot_longer(cols = starts_with("Year."), names_to = "natural_year", values_to = "fault_count") %>% # 提取年份数值、计算交付后第几年 mutate(natural_year_num = as.integer(str_extract(natural_year, "\\d+")), delivery_year_num = as.integer(`Delivery Year`), year_offset = natural_year_num - delivery_year_num + 1) %>% # 过滤交付前的无效年份数据 filter(year_offset >= 1) %>% # 转回宽格式,按交付后第几年命名列 pivot_wider(id_cols = c(`Delivery Year`, Freq), names_from = year_offset, values_from = fault_count, names_prefix = "Year.") %>% arrange(`Delivery Year`)
如果需要无依赖的基础R实现,可使用逐行apply方案:
# 提取故障列和对应年份 year_cols <- grep("^Year\\.", colnames(data), value = TRUE) year_nums <- as.integer(sub("Year\\.", "", year_cols)) # 逐行移位 shifted_rows <- t(apply(data, 1, function(row) { delivery_year <- as.integer(row[1]) start_idx <- which(year_nums == delivery_year) shift_vals <- row[year_cols][start_idx:length(year_cols)] c(shift_vals, rep(NA, length(year_cols) - length(shift_vals))) })) # 拼接输出结果 result <- cbind(data[, c("Delivery Year", "Freq")], shifted_rows) colnames(result) <- c("Delivery Year", "Freq", paste0("Year.", 1:length(year_cols)))
2. 故障占比百分比转换
在移位后的结果基础上,直接对年份列批量计算占比即可:
# 同时保留原始计数和百分比 result_with_pct <- result %>% mutate(across(starts_with("Year."), ~ round(.x / Freq * 100, 2), .names = "{col}_pct")) # 直接替换原始计数为百分比 result_pct_only <- result %>% mutate(across(starts_with("Year."), ~ round(.x / Freq * 100, 2)))
可根据需要调整round函数的参数修改小数保留位数。
内容的提问来源于stack exchange,提问作者Jaroslav Kotrba
相关产品推荐
相关产品推荐

