按列分组,然后自动计算以相同字母开头的多列

Posted

技术标签:

【中文标题】按列分组,然后自动计算以相同字母开头的多列【英文标题】:Group by a column and then automatically count over multiple columns starting with the same alphabet 【发布时间】:2021-09-16 17:01:56 【问题描述】:

我正在尝试结合group_by 功能做一个简单的counts 操作。

例如df如下:

Task   q1  q2
Alpha  1   NA
Beta   NA  NA
Alpha  4   2
Alpha  5   NA
Beta   2   2
Gamma  NA  3

我想要以下输出

Task   q1   q2
Alpha  3    1 
Beta   1    1 
Gamma  0    1 

要求一:

总的来说,我想计算条目对应于非缺失值的次数(在本例中为 0-5 之间的任何值)。我对值是什么不感兴趣,我只对它们被报告的次数感兴趣 - 对应于每个任务。

我可以使用sqldf 执行此操作,如下所示:

sqldf('SELECT Task, count(q1), count(q2)
FROM df
GROUP BY Task')

我也可以使用dplyr 包来做到这一点:

df %>%  
  group_by(Task) %>% 
  summarise(q1 = sum(!is.na(q1)),
            q2 = sum(!is.na(q2)))

但我想知道是否有自动执行此操作的方法,例如,当我有可变数量的度量时,有时是 q1:q3,有时它们可​​能是 q1:q10。像paste0("q", 1:n) 这样的东西。但是我很难将它整合到我的代码中。

要求 2:

稍后,我还想为每个任务alpha, beta, gamma 计算每个度量q 的出现百分比。

任何帮助将不胜感激。

我看过其他帖子,但它们对我没有用,可能是因为我缺乏使用 dplyr 包进行编码的能力。例如,

r: group by multiple columns and count,

How do I get count from multiple columns in R?

Count occurance of multiple columns by group in R

【问题讨论】:

sprintf("select Task, %s from df group by Task", toString(sprintf("count(%s)", paste0("q", 1:n)))) 【参考方案1】:

您可以使用across 将函数应用于多个列。

library(dplyr)

df %>%
  group_by(Task) %>%
  summarise(across(.fns = ~sum(!is.na(.))))
  #Or if you have other columns in your data 
  #apply the function to only the columns that start with 'q'
  #summarise(across(starts_with('q'), ~sum(!is.na(.))))

#  Task     q1    q2
#  <chr> <int> <int>
#1 Alpha     3     1
#2 Beta      1     1
#3 Gamma     0     1

【讨论】:

非常感谢,@Ronak Shah 我会在我的原始数据上运行它并回复你。关于我们如何更新它以包含百分比而不是计数的任何建议? 获取百分比替换summean

以上是关于按列分组,然后自动计算以相同字母开头的多列的主要内容,如果未能解决你的问题,请参考以下文章

如何创建按列分组的累积总和

按列值的差异对 SQL 中的数据进行分组

计算按列分组的模式

Power Query M - 使用自定义聚合(百分位)按列值分组

SQL sum 按列分组,包括与从属相同的表的行

按列分组并计算百分比,windows函数分区