如何在R中基于动态列范围按行计算求和值
解决行内动态列范围求和问题
你的问题核心是across无法逐行识别不同的列范围——它是面向列的批量操作,ends_with()只能接收单个匹配字符串,因此会默认取df$selection的第一个元素,进而触发警告并导致结果错误。下面提供几种可行的解决方法:
方法一:使用rowwise()逐行处理
通过rowwise()让数据按行分组,结合cur_data()获取当前行的数据,再动态选择列范围求和:
library(tidyverse) df <- tibble(value_2024 = runif(4), value_2023 = runif(4), value_2022 = runif(4), selection = c(2023, 2022, 2024, 2022)) df %>% rowwise() %>% mutate(value_sum = sum(cur_data() %>% select(value_2022:ends_with(as.character(selection))))) %>% ungroup()
方法二:转长格式后分组计算
将宽格式数据转为长格式,按行筛选符合年份范围的数据后求和,再转回宽格式:
df %>% mutate(row_id = row_number()) %>% pivot_longer(cols = starts_with("value_"), names_to = "year", names_prefix = "value_", values_to = "value") %>% mutate(year = as.integer(year)) %>% group_by(row_id) %>% filter(year >= 2022 & year <= selection) %>% summarise(value_sum = sum(value), .groups = "drop") %>% right_join(df %>% mutate(row_id = row_number()), by = "row_id") %>% select(-row_id) %>% relocate(value_sum, .after = selection)
方法三:基础R的apply逐行处理
用apply遍历每一行,动态匹配列范围并求和:
df$value_sum <- apply(df, 1, function(row) { target_year <- as.character(row["selection"]) # 找到value_2022和目标年份列的位置,取中间所有列 col_positions <- which(names(df) %in% c("value_2022", paste0("value_", target_year))) sum(as.numeric(row[min(col_positions):max(col_positions)])) })
内容的提问来源于stack exchange,提问作者Norbi
相关产品推荐
相关产品推荐

