我有以下数据表。
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/