如何使用 R dplyr 的 summarize 来计算符合条件的行数?
How to use R dplyr's summarize to count the number of rows that match a criteria?
我有一个要总结的数据集。首先,我想要主场和客场比赛的总和,我可以做到。但是,我还想知道每个子类别(主场、客场)中有多少异常值(定义为超过 300 分)。
如果我没有使用总结,我知道 dplyr
有 count()
功能,但我希望这个解决方案出现在我的 summarize()
调用中。这是我所拥有的和我尝试过的,但未能执行:
#Test data
library(dplyr)
test <- tibble(score = c(100, 150, 200, 301, 150, 345, 102, 131),
location = c("home", "away", "home", "away", "home", "away", "home", "away"),
more_than_300 = c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE))
#attempt 1, count rows that match a criteria
test %>%
group_by(location) %>%
summarize(total_score = sum(score),
n_outliers = nrow(.[more_than_300 == FALSE]))
您可以在逻辑向量上使用 sum
- 它会自动将它们转换为数值(TRUE
等于 1,FALSE
等于 0),因此您需要只做:
test %>%
group_by(location) %>%
summarize(total_score = sum(score),
n_outliers = sum(more_than_300))
#> # A tibble: 2 x 3
#> location total_score n_outliers
#> <chr> <dbl> <int>
#> 1 away 927 2
#> 2 home 552 0
或者,如果这些是您仅有的 3 列,则等效项为:
test %>%
group_by(location) %>%
summarize(across(everything(), sum))
事实上,您不需要制作 more_than_300
列 - 这样做就足够了:
test %>%
group_by(location) %>%
summarize(total_score = sum(score),
n_outliers = sum(score > 300))
在 base R 中,我们可以这样尝试 aggregate
> aggregate(.~location,test,sum)
location score more_than_300
1 away 927 2
2 home 552 0
在基数 xtabs
中可用于对每组求和。
xtabs(cbind(score, more_than_300) ~ ., test)
#location score more_than_300
# away 927 2
# home 552 0
或者通过动态计算异常值并给出所需的列名。
xtabs(cbind(total_score = score, n_outliers = score > 300) ~ location, test)
#location total_score n_outliers
# away 927 2
# home 552 0
另一个选项,也在基础中,将是 rowsum
。
with(test, rowsum(cbind(total_score = score, n_outliers = score > 300), location))
# total_score n_outliers
#away 927 2
#home 552 0
xtabs
和 rowsum
专门计算每组的总和,可能在此任务中表现出色。
我有一个要总结的数据集。首先,我想要主场和客场比赛的总和,我可以做到。但是,我还想知道每个子类别(主场、客场)中有多少异常值(定义为超过 300 分)。
如果我没有使用总结,我知道 dplyr
有 count()
功能,但我希望这个解决方案出现在我的 summarize()
调用中。这是我所拥有的和我尝试过的,但未能执行:
#Test data
library(dplyr)
test <- tibble(score = c(100, 150, 200, 301, 150, 345, 102, 131),
location = c("home", "away", "home", "away", "home", "away", "home", "away"),
more_than_300 = c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE))
#attempt 1, count rows that match a criteria
test %>%
group_by(location) %>%
summarize(total_score = sum(score),
n_outliers = nrow(.[more_than_300 == FALSE]))
您可以在逻辑向量上使用 sum
- 它会自动将它们转换为数值(TRUE
等于 1,FALSE
等于 0),因此您需要只做:
test %>%
group_by(location) %>%
summarize(total_score = sum(score),
n_outliers = sum(more_than_300))
#> # A tibble: 2 x 3
#> location total_score n_outliers
#> <chr> <dbl> <int>
#> 1 away 927 2
#> 2 home 552 0
或者,如果这些是您仅有的 3 列,则等效项为:
test %>%
group_by(location) %>%
summarize(across(everything(), sum))
事实上,您不需要制作 more_than_300
列 - 这样做就足够了:
test %>%
group_by(location) %>%
summarize(total_score = sum(score),
n_outliers = sum(score > 300))
在 base R 中,我们可以这样尝试 aggregate
> aggregate(.~location,test,sum)
location score more_than_300
1 away 927 2
2 home 552 0
在基数 xtabs
中可用于对每组求和。
xtabs(cbind(score, more_than_300) ~ ., test)
#location score more_than_300
# away 927 2
# home 552 0
或者通过动态计算异常值并给出所需的列名。
xtabs(cbind(total_score = score, n_outliers = score > 300) ~ location, test)
#location total_score n_outliers
# away 927 2
# home 552 0
另一个选项,也在基础中,将是 rowsum
。
with(test, rowsum(cbind(total_score = score, n_outliers = score > 300), location))
# total_score n_outliers
#away 927 2
#home 552 0
xtabs
和 rowsum
专门计算每组的总和,可能在此任务中表现出色。