r - 按组 ID 条件的行数
问题描述
我有一个这样的数据框:
ID S1 C
1 1 2 3
2 1 2 3
3 3 1 1
4 6 2 5
5 6 7 5
我需要的是每组的行数ID
where 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
解决方案
一个base
R 解决方案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)))
推荐阅读
- sql - Oracle将两行合并为具有更多列的单行
- php - 使用 exec 调用时 pdfinfo 不显示结果
- java - NonUniqueObjectException 更新中的休眠异常
- postgresql - 索引多租户数据库
- xamarin.forms - 从绑定属性中读取选定项
- python - Webdriver Selenium 无法导航到下一页
- python - 对某些位置的某些列表元素进行排序,其他位置保持不变
- linux - 如何在模式匹配后仅对多个模式中的一个模式进行 grep 行
- mysql - mariadb 错误 2026 (HY000): SSL 连接错误: 不支持的协议
- pandas - Python Pandas:添加两个数据框的缺失行并保留额外的列