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

获取行内最低值列名时忽略NA值的R语言技术问题

问题:获取对应最低价的零售商名称(忽略NA值)

现有零售商品价格数据,行对应商品,列对应零售商,部分零售商不售卖部分商品(NA值),已通过dplyr生成cheapestPRICE列,但生成cheapestSTORE列时遇到两个问题:

  1. 执行以下代码时报错:Error in FUN(left) : invalid argument to unary operator,推测因包含itemName字符列导致:
retailPRICE$cheapestSTORE <- names(retailPRICE)[minCol(replace(retailPRICE, is.na(retailPRICE), 0), ties.method = "first")]
  1. 未报错时,minCol会将NA识别为最低值,导致商店匹配错误,错误输出如下:
itemNameAldiWalmartCostcocheapestPRICEcheapestSTORE
ApplesNA0.75NA0.75Aldi
Bananas0.550.69NA0.55Costco
Milk1.952.150.160.16Costco
Eggs157.00192.0075.0075.00Costco
Cereal1.101.10NA1.10Costco

期望得到正确的cheapestSTORE列,结果如下:

itemNameAldiWalmartCostcocheapestPRICEcheapestSTORE
ApplesNA0.75NA0.75Walmart
Bananas0.550.69NA0.55Aldi
Milk1.952.150.160.16Costco
Eggs157.00192.0075.0075.00Costco
Cereal1.101.10NA1.10Aldi

解决方案

方法1:dplyr + apply逐行处理

直接针对价格列逐行计算,忽略NA值并处理价格相同的情况(取第一个出现的零售商):

library(dplyr)

# 原始数据
itemName <- c('Apples', 'Bananas', 'Milk', 'Eggs', 'Cereal')
Aldi <- c(NA, 0.55, 1.95, 157.00, 1.10)
Walmart <- c(0.75, 0.69, 2.15, 192.00, 1.10)
Costco <- c(NA, NA, 0.16, 75.00, NA)

retailPRICE <- data.frame(itemName, Aldi, Walmart, Costco) %>%
  mutate(cheapestPRICE = pmin(Aldi, Walmart, Costco, na.rm = TRUE),
         # 仅处理价格列,避免字符列干扰
         cheapestSTORE = apply(select(., Aldi, Walmart, Costco), 1, function(row) {
           # 找到等于该行最低价的第一个零售商名称(自动忽略NA)
           names(row)[which(row == min(row, na.rm = TRUE))[1]]
         }))

方法2:tidyr重塑数据(逻辑更清晰)

通过将宽表转为长表,更直观地筛选每个商品的最低价零售商:

library(dplyr)
library(tidyr)

# 原始数据
itemName <- c('Apples', 'Bananas', 'Milk', 'Eggs', 'Cereal')
Aldi <- c(NA, 0.55, 1.95, 157.00, 1.10)
Walmart <- c(0.75, 0.69, 2.15, 192.00, 1.10)
Costco <- c(NA, NA, 0.16, 75.00, NA)

retailPRICE <- data.frame(itemName, Aldi, Walmart, Costco) %>%
  # 先计算最低价
  mutate(cheapestPRICE = pmin(Aldi, Walmart, Costco, na.rm = TRUE)) %>%
  # 转长表:每个商品-零售商组合为一行
  pivot_longer(cols = c(Aldi, Walmart, Costco), names_to = "store", values_to = "price") %>%
  # 按商品分组,筛选价格等于最低价的行,取第一个(处理价格相同的情况)
  group_by(itemName) %>%
  filter(price == cheapestPRICE) %>%
  slice(1) %>%
  # 提取商店名称,合并回原表
  select(itemName, cheapestSTORE = store) %>%
  right_join(retailPRICE, by = "itemName") %>%
  # 调整列顺序与期望一致
  select(itemName, Aldi, Walmart, Costco, cheapestPRICE, cheapestSTORE)

内容的提问来源于stack exchange,提问作者Amanda Ballenger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:17:01