r - 分组后如何统计某个条件的数据

标签 r data.table

我有以下数据表。

dat <- read_csv(
    "name,cnt
     a,10
     a,22
     a,13
     b,4
     c,4
     c,5
     c,10"
  )

> dat
# A tibble: 7 x 2
  name    cnt
  <chr> <dbl>
1 a        10
2 a        22
3 a        13
4 b         4
5 c         4
6 c         5
7 c        10

我想计算分组后 cnt 低于当前行值的行数:

> dat
# A tibble: 7 x 3
  name    cnt  nrow
  <chr> <dbl> <dbl>
1 a        10     0
2 a        22     2
3 a        13     1
4 b         4     0
5 c         4     0
6 c         5     1
7 c        10     2

我尝试编写一个自定义函数来计算行数,但我对 for 循环的性能感到困惑。有没有更好的方法呢?

最佳答案

我们可以group_by name 并计算大于当前值的值的数量。

library(dplyr)

dat %>%
  group_by(name) %>%
  mutate(nrow = purrr::map_int(cnt, ~sum(. > cnt)))

#  name    cnt  nrow
#  <chr> <dbl> <int>
#1 a        10     0
#2 a        22     2
#3 a        13     1
#4 b         4     0
#5 c         4     0
#6 c         5     1
#7 c        10     2

在基础 R 中,我们可以创建一个自定义函数

get_count <- function(x) {
  sapply(x, function(i) sum(i > x))
}

并使用 ave 为每个 name 应用它

with(dat, ave(cnt, name, FUN = get_count))
#[1] 0 2 1 0 0 1 2

关于r - 分组后如何统计某个条件的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58760387/

相关文章:

r - 如何根据主机名动态更改 R .libPaths() ?

r - 在rapply中获取元素名称

r - 将回归系数存储在 R data.table 中

python - Pandas 的数据框(Python)是否更接近 R 的数据框或数据表?

r - 将列表字符串向量解析为多列 data.table

r - 从数字 YYYYMMDD 到日期并返回到数字 YYYYMMDD 的最快方法

r - 在 R 中将函数与矢量参数集成

r - 为ggplot2中的每一行分配颜色

r - 无法使用 R 中 rgbif 包的 occ_search 函数获取出现数据

r - 如何优化 data.table (r) 中的滞后差异