非零值的比例乘以 columns/groups

Proportion of non-zero values by multiple columns/groups

我有一个类似于 的问题,但要将平均分数按许多列分组。我想通过“年”和“季节”获得“num”中非零值的比例。适用于 n# 列的东西,无论它们在 df 中相对于彼此的位置如何。

我的数据:

> head(df)
# A tibble: 6 x 6
  Year  Month   Day Station   num season
  <fct> <dbl> <dbl>   <dbl> <dbl> <fct> 
1 2017      1     3     266     4 DRY   
2 2018      1     3     270     2 DRY   
3 2018      1     3     301     1 DRY   
4 2018      1     4     314     0 DRY   
5 2018      2     4     402     0 DRY   
6 2018      1     4     618     0 WET 

我认为这样的方法可行,但我收到一条警告消息:

> aggregate(df$num>0~df[,c(1,6)],FUN=mean) # Average proportion of num > 0 per year & season

Error in model.frame.default(formula = env_subset$den > 0 ~ env_subset[,  : 
  invalid type (list) for variable 'env_subset[, c(1, 6)]'

有了dplyr,我想这就是你想要的:

library(dplyr)
df %>% group_by(Year, season) %>%
  summarize(prop_gt_0 = mean(num > 0), .groups = "drop")
# # A tibble: 3 × 3
#    Year season prop_gt_0
#   <int> <chr>      <dbl>
# 1  2017 DRY          1  
# 2  2018 DRY          0.5
# 3  2018 WET          0  

通常通过名称而不是数字来引用列更好,所以,正如您所说,它有效“无论它们在 df 中的什么位置”.

您仍然可以使用 aggregate--我更喜欢使用列名的公式界面:

aggregate(num ~ Year + season, data = df, FUN = \(x) mean(x > 0))
#   Year season num
# 1 2017    DRY 1.0
# 2 2018    DRY 0.5
# 3 2018    WET 0.0