r-按一列分组,然后自动从同一字母表开始对多列进行计数



我正在尝试结合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 

要求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: 按多列和计数分组,

如何从R中的多列中获取计数?

按组计数R 中多列的出现次数

您可以使用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

最新更新