You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:04:56