如何在R语言中通过列名变量计算数据框指定范围的行和
问题分析与解决
你的代码存在两个核心错误:
- 数据框索引语法错误:
Book1[c,(any_of(...))]中的c,是无效写法,行索引位置若要选择所有行,应留空或写TRUE。 any_of()的误用:any_of()返回的是逻辑向量(标记列是否存在),无法与:结合生成连续的列位置范围,:需要的是数值类型的列索引。
以下是两种可行的解决方案:
方案1:Base R 实现
先通过列名找到对应的列位置,再用rowSums计算行和:
library(readxl) library(dplyr) Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx",sheet = "Sheet4") Last_Date <- tail(colnames(Book1),1) First_Date <- head(colnames(Book1),3)[3] # 获取起始和结束列的数值索引 start_idx <- which(colnames(Book1) == First_Date) end_idx <- which(colnames(Book1) == Last_Date) # 计算指定列范围的行和 Book1$Sum <- rowSums(Book1[, start_idx:end_idx])
方案2:dplyr 风格实现
利用dplyr的列选择函数all_of()配合select或c_across来实现:
方式A:结合select与rowSums
library(readxl) library(dplyr) Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx",sheet = "Sheet4") Last_Date <- tail(colnames(Book1),1) First_Date <- head(colnames(Book1),3)[3] Book1 <- Book1 %>% mutate(Sum = rowSums(select(., all_of(First_Date):all_of(Last_Date))))
方式B:结合rowwise与c_across
library(readxl) library(dplyr) Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx",sheet = "Sheet4") Last_Date <- tail(colnames(Book1),1) First_Date <- head(colnames(Book1),3)[3] Book1 <- Book1 %>% rowwise() %>% mutate(Sum = sum(c_across(all_of(First_Date):all_of(Last_Date)))) %>% ungroup()
注:
all_of()用于确认列名存在并转换为列位置,适合已知列名一定存在的场景;若不确定列名是否存在,可替换为any_of(),但此时需确保起始和结束列都存在才能生成有效范围。
内容的提问来源于stack exchange,提问作者user20203146
相关产品推荐
相关产品推荐

