如何在R中循环数据框并按特定逻辑添加新列
嘿,我来帮你解决这个问题!首先先把你没写完的数据框代码补全,然后我们来实现循环添加新列的需求。
首先,完整的创建数据框的代码是这样的(你之前的代码没写完,我帮你补全了):
branch <- c("Chicago","Chicago","Chicago","Chicago","Chicago","Chicago","LA","LA","LA","LA","LA","LA","LA","Tampa","Tampa","Tampa","Tampa","Tampa","Tampa","Tampa","Tampa") customer <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) sales <- c(33816,24534,47735,1467,39389,30659,21074,20195,45165,37606,38967,41681,47465,3061,23412,22993,34738,19408,11637,36234,23809) data <- data.frame(branch, customer, sales)
接下来,我假设你需要的特定逻辑是:为每个客户添加其所在门店的平均销售额,以及该客户销售额与门店均值的差值。如果你的逻辑不同,只需要替换循环里的计算部分即可。
用循环实现的方案
我们可以按门店分组循环,这样比逐行循环效率更高:
# 先初始化两个新列,用NA填充 data$branch_avg_sales <- NA data$sales_diff_from_avg <- NA # 获取所有不重复的门店名称 unique_branches <- unique(data$branch) # 遍历每个门店进行计算 for (b in unique_branches) { # 筛选出当前门店的所有数据 current_branch_data <- data[data$branch == b, ] # 计算该门店的平均销售额 branch_avg <- mean(current_branch_data$sales) # 给当前门店的行赋值新列 data[data$branch == b, "branch_avg_sales"] <- branch_avg data[data$branch == b, "sales_diff_from_avg"] <- current_branch_data$sales - branch_avg } # 查看前几行结果 head(data)
额外推荐:更高效的非循环方案(R风格)
虽然你要求用循环,但在R中,向量式操作或者用dplyr包的分组操作通常更简洁高效,这里也给你参考一下:
# 先加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) data <- data %>% group_by(branch) %>% # 按门店分组 mutate( branch_avg_sales = mean(sales), # 计算门店均值 sales_diff_from_avg = sales - branch_avg_sales # 计算差值 ) %>% ungroup() # 取消分组
如果你的特定逻辑不是这个,比如要计算每个客户的销售额排名、或者与门店最高销售额的差距等等,只需要把循环里的计算逻辑替换成你需要的即可。
内容的提问来源于stack exchange,提问作者Ravi Dawar
相关产品推荐
相关产品推荐

