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

在R中基于条件统计两列频次:识别多供应商采购的物料编号

解决R中找出多供应商物料并添加计数的问题

嘿,这问题我熟!咱们用R来处理这个需求很简单,分几步就能搞定,不管你习惯用dplyr还是基础R都有对应的方法。

第一步:构造示例数据集

先把你给出的示例数据转换成R的DataFrame,方便后续操作:

df <- data.frame(
  OrderNo. = 1:12,
  Supplier = c("LF", "LF", "LF", "DD", "DD", "DF", "DF", "DD", "DD", "AA", "AB", "AC"),
  Materialno = c(101,101,101,101,102,103,104,103,104,105,105,106),
  stringsAsFactors = FALSE # 避免自动转成因子,R新版本默认已开启此设置
)

方法一:用dplyr包(推荐,代码更直观)

dplyr是tidyverse系列里处理数据的利器,代码可读性很高:

library(dplyr)

# 给每行添加对应物料的供应商计数
result <- df %>%
  group_by(Materialno) %>% # 按物料编号分组
  mutate(Count = n_distinct(Supplier)) %>% # 计算每组内唯一供应商的数量,生成Count列
  ungroup() # 取消分组,回到普通DataFrame

# 如果你只需要保留有两家及以上供应商的物料行,再加筛选步骤
filtered_result <- result %>%
  filter(Count >= 2)

代码解释:

  • group_by(Materialno):把数据按物料编号分成一个个独立小组
  • mutate(Count = n_distinct(Supplier)):在每个小组内,统计唯一供应商的数量,将结果存入新的Count列,原数据的每一行都会对应上所属物料的计数
  • filter(Count >=2):可选步骤,只保留那些有两家及以上供应商供货的物料行

方法二:用基础R(无需额外安装包)

如果你不想加载第三方包,用基础R的ave()函数也能实现:

# 添加Count列
df$Count <- ave(df$Supplier, df$Materialno, FUN = function(x) length(unique(x)))

# 筛选两家及以上供应商的物料
filtered_df <- df[df$Count >= 2, ]

代码解释:

  • ave()函数会按Materialno分组,对每组的Supplier执行自定义函数:length(unique(x))就是计算该组内唯一供应商的数量
  • 最后用索引筛选出Count≥2的行即可

验证结果

不管用哪种方法,最终的结果数据框都会和你期望的格式一致,比如物料101的每一行Count都是2,物料103的每一行Count也是2,完全符合你的示例要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:20:01