在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
相关产品推荐
相关产品推荐

