Excel中是否有COUNTIF函数可以处理整个数据集?(或者R中类似的函数)

blpfk2vs  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(148)

我在Excel中有一个4列8行的数据集,第一列是类型,有重复的条目。第2列到第4列是人员,单元格是事件计数(样本集)。我对每个人的每种类型的计数加起来不感兴趣,我追求的是每个人找到多少种类型。我可以使用=SUMIF(range,criteria,{sum_range])公式,然后在第二步中删除“零”计数,并获得类型的数量,一次针对一个人。我的数据集有数千种类型和数百个名称,所以这不是一个选项。
从本质上讲,它是关于从列类型中删除重复项,并在其他列中用yes/no或true/false指示该人是否具有该类型。
有没有一个公式,所有的人一次?
| 类型|人A|人B|人C|
| - -|- -|- -|- -|
| 一种|第0页|四十五|小行星23462|
| B|四百五十六|小行星3452|第0页|
| C语言|第0页|四个|小行星4536|
| 日|五十六人|第0页|一个|
| 日|九个|小行星一千二百三十五|八个|
| B|第0页|第0页|第0页|
| (c)秘书长的报告|七十八|第0页|第0页|

jyztefdp

jyztefdp1#

我有一个R的答案给你。(以后,请以易于复制的格式提供您的数据!)

df <- data.frame(type = c("a", "b", "c", "d", "d", "b", "c"), 
                 person_a = c(0, 456, 0, 56, 9, 0, 78), 
                 person_b = c(45, 3452, 4, 0, 1235, 0, 0),
                 person_c = c(23462, 0, 4536, 1, 8, 0, 0))

df |> 
  tidyr::pivot_longer(cols = -c(type), names_to = "person", values_to = "count") |> 
  dplyr::group_by(person) |> 
  dplyr::filter(count != 0) |> 
  dplyr::summarize(num_types = length(unique(type))) |>
  dplyr::ungroup()

这将生成一个漂亮的小表:
| 人|类型数|
| - -|- -|
| 人_a|三个|
| 人员_B|四个|
| 人_c|三个|
此答案将针对任意数量的类型和人员进行缩放。如果数据框包含不希望聚合的其他非人员列,甚至可以按如下方式修改透视:tidyr::pivot_longer(cols = tidyselect::starts_with("person"), names_to = "person", values_to = "count")。如果要删除“person”前缀,请将以下参数添加到pivot_longer调用中:names_prefix = "person_" .

编辑

这是你想要的吗?

df |> 
  dplyr::group_by(type) |> 
  dplyr::summarize(dplyr::across(dplyr::starts_with("person"), 
                   function(person) as.numeric(max(person) > 0)))

该表如下所示:
| 类型|人_a|人员_B|人_c|
| - -|- -|- -|- -|
| 一种|第0页|一个|一个|
| B|一个|一个|第0页|
| C语言|一个|一个|一个|
| 日|一个|一个|一个|
基本上,我们将df中以“person”开头的列汇总为1(如果该类型的行中至少有一行具有正计数),否则为0。

cvxl0en2

cvxl0en22#

您是否尝试过数组公式(也称为CSE公式)?请参阅以下内容:https://www.mrexcel.com/excel-tips/cse-array-formulas-excel/
可以使用多个条件(if语句)链接在一起。我经常使用SUM(IF([condition 1],IF([condition 2],1,0),0))来实现多条件计数。

相关问题