要为每个“ID”组选择具有最小“编号”的行,我们可以使用按组聚合功能之一。 base R 选项是 aggregate。使用aggregate,我们可以使用“公式”方法或使用by 参数指定分组元素/变量的list。使用formula 方法,我们得到每个“ID”的“数字”min 值。
aggregate(Number~ID, df1, FUN=min)
或者我们可以使用更快的选项data.table。在这里,我们将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'ID' 分组,我们得到“Number”的min 值。
library(data.table)
setDT(df1)[, list(Number=min(Number)), by = ID]
或者这也可以使用setorder 到order 'Number' 列并使用unique 和by 选项来选择第一个非重复的'ID' 行。 (来自@David Arenburgs 的 cmets)
unique(setorder(setDT(df1), Number), by = "ID")
或者使用dplyr,我们按“ID”分组并获得带有summarise的子集行。
library(dplyr)
df1 %>%
group_by(ID) %>%
summarise(Number= min(Number))
或者我们可以使用sqldf语法来获取数据子集。
library(sqldf)
sqldf('select ID,
min(Number) as Number
from df1
group by ID')
更新
如果有多个列,并且您想根据每个“ID”的“数字”最小值获取行,则可以使用which.min。使用.I 将获得行索引,并可用于对行进行子集化。
setDT(df1)[df1[, .I[which.min(Number)], by = ID]$V1]
或者使用dplyr,我们使用slice 过滤出每个“ID”的min 值为“Number”的行
df1 %>%
group_by(ID) %>%
slice(which.min(Number))