在R Studio中如何用循环提取数据框指定列计算每日销售总和
错误原因分析
- 第一种写法错误点:
$运算符优先级高于函数调用,R会优先识别SalesData$get为提取数据框中名为get的列,后续接括号相当于尝试对列对象执行函数调用,因此抛出「attempt to apply non-function」报错。 - 第二种写法错误点:
$运算符不支持直接解析动态生成的字符串列名,会把colnames(SalesData)[i]整体作为固定列名去数据框中匹配,自然找不到对应列。
正确循环实现
R中动态提取数据框列需要用双中括号[[运算符,支持传入字符串格式的列名,正确循环写法如下:
# 先初始化新列,避免循环过程中动态扩容降低效率 SalesData$Dailysum <- NA_real_ for (i in 1:50) { # 提取对应日期列,求和后赋值,na.rm=TRUE可避免缺失值导致结果为NA SalesData$Dailysum[i] <- sum(SalesData[[colnames(SalesData)[i]]], na.rm = TRUE) }
如果确认数据框前50列就是Day1到Day50的销售列,也可以直接按列索引提取,写法更简单:
SalesData$Dailysum <- NA_real_ for (i in 1:50) { SalesData$Dailysum[i] <- sum(SalesData[, i], na.rm = TRUE) }
更高效的向量化实现
其实不需要写循环,用R内置的colSums函数一行就能完成计算,执行效率远高于显式循环:
# 直接对前50列按列求和 SalesData$Dailysum <- colSums(SalesData[, 1:50], na.rm = TRUE)
如果担心列顺序变动导致计算错误,也可以通过列名规则匹配目标销售列:
# 匹配所有名称为Day+数字格式的列 target_cols <- grep("^Day\\d+$", colnames(SalesData), value = TRUE) SalesData$Dailysum <- colSums(SalesData[, target_cols], na.rm = TRUE)
内容的提问来源于stack exchange,提问作者Eliyah Jung
相关产品推荐
相关产品推荐

