首页 > 解决方案 > 按组 ID 条件的行数

问题描述

我有一个这样的数据框:

  ID S1 C
1 1  2  3  
2 1  2  3
3 3  1  1
4 6  2  5
5 6  7  5

我需要的是每组的行数IDwhere S1 <= C. 这是所需的输出。

  ID  Obs 
1 1   2 
2 3   1 
3 6   1 

即使问题在下面得到了回答,我还有一个后续问题:是否可以对多个列(S1、S2、..)执行相同的操作。例如对于下面的数据框:

  ID S1  S2 C
1 1  2   2  3  
2 1  2   2  3
3 3  1   1  1
4 6  2   2  5
5 6  7   7  5

然后得到:

  ID  S1.Obs S2.Obs 
1 1   2      2
2 3   1      1
3 6   1      1

标签: rdataframedplyr

解决方案


一个baseR 解决方案aggregate()

aggregate(Obs ~ ID, transform(df, Obs = S1 <= C), sum)

#   ID Obs
# 1  1   2
# 2  3   1
# 3  6   1

一个dplyr解决方案

library(dplyr)

df %>%
  filter(S1 <= C) %>%
  count(ID, name = "Obs")

#   ID Obs
# 1  1   2
# 2  3   1
# 3  6   1

数据

df <- structure(list(ID = c(1L, 1L, 3L, 6L, 6L), S1 = c(2L, 2L, 1L, 2L, 7L),
C = c(3L, 3L, 1L, 5L, 5L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))

扩大

如果要将此规则应用于 S1、S2、S3 等多个列:

df %>%
  group_by(ID) %>%
  summarise(across(starts_with("S"), ~ sum(.x <= C)))

推荐阅读