R语言中无重复获取所有可能组合及学生水果食用统计方法

R语言实现水果食用分组统计与无重复组合生成
以下操作默认你的数据集对象名为stu_fruit,其中包含apple、banana、orange三列,取值为1(对应食用)/0(对应不食用),每行对应1个学生样本。
各食用场景人数统计
基础R实现(无需安装额外包)
直接通过逻辑向量求和统计符合条件的样本量即可:
# 仅食用苹果 n_apple_only <- sum(stu_fruit$apple == 1 & stu_fruit$banana == 0 & stu_fruit$orange == 0) # 仅食用香蕉 n_banana_only <- sum(stu_fruit$apple == 0 & stu_fruit$banana == 1 & stu_fruit$orange == 0) # 仅食用橙子 n_orange_only <- sum(stu_fruit$apple == 0 & stu_fruit$banana == 0 & stu_fruit$orange == 1) # 食用全部三种水果 n_all <- sum(stu_fruit$apple == 1 & stu_fruit$banana == 1 & stu_fruit$orange == 1) # 仅食用苹果+香蕉(不含同时吃橙子的样本,若要包含则去掉& orange == 0条件) n_apple_banana <- sum(stu_fruit$apple == 1 & stu_fruit$banana == 1 & stu_fruit$orange == 0) # 仅食用苹果+橙子 n_apple_orange <- sum(stu_fruit$apple == 1 & stu_fruit$banana == 0 & stu_fruit$orange == 1) # 仅食用香蕉+橙子 n_banana_orange <- sum(stu_fruit$apple == 0 & stu_fruit$banana == 1 & stu_fruit$orange == 1)
如果需要一次性输出所有分组(含三种都不吃的样本)的统计结果,可以先给每行打组合标签再计数:
stu_fruit$combo <- with(stu_fruit, ifelse(apple==1&banana==0&orange==0,"仅苹果", ifelse(apple==0&banana==1&orange==0,"仅香蕉", ifelse(apple==0&banana==0&orange==1,"仅橙子", ifelse(apple==1&banana==1&orange==1,"三种全吃", ifelse(apple==1&banana==1&orange==0,"苹果+香蕉", ifelse(apple==1&banana==0&orange==1,"苹果+橙子", ifelse(apple==0&banana==1&orange==1,"香蕉+橙子","三种都不吃"))))))) table(stu_fruit$combo)
无重复获取所有可能的水果组合
直接用R内置的combn()函数即可生成无重复、无顺序差异的组合,不会出现“苹果+香蕉”和“香蕉+苹果”这类重复项:
# 定义水果类别集合 fruit_list <- c("苹果","香蕉","橙子") # 生成所有长度从1到3的非空组合 all_combinations <- unlist(lapply(1:length(fruit_list), function(k) combn(fruit_list, k, simplify = F)), recursive = F)
如果需要把组合拼接成易读的字符串格式,可执行:
combo_labels <- sapply(all_combinations, paste, collapse = "+")
运行后combo_labels输出结果如下,和需要统计的分组完全匹配:
[1] "苹果" "香蕉" "橙子" "苹果+香蕉" "苹果+橙子" "香蕉+橙子" "苹果+香蕉+橙子"
内容的提问来源于stack exchange,提问作者user142632
相关产品推荐
相关产品推荐

