非零值的比例乘以 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
我有一个类似于
我的数据:
> 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