我有一个数据,第一列是一堆ID号(有些重复),第二列只是一堆数字。我需要一种方法来保持每个ID号只基于第二列中的最小数字。
Row# ID Number
1 10 180
2 12 167
3 12 182
4 12 135
5 15 152
6 15 133
例如:我只想在这里保留第1,第4和第6行并删除其余的
答案 0 :(得分:14)
为了选择每个'ID'组具有最小'Number'的行,我们可以使用group by聚合功能之一。 base R
选项为aggregate
。使用aggregate
,我们可以使用'formula'方法或使用list
参数指定by
分组元素/变量。使用formula
方法,我们会为每个“ID”获得“{1”}值{。}。
min
或者我们可以使用aggregate(Number~ID, df1, FUN=min)
更快的选项。在这里,我们将'data.frame'转换为'data.table'(data.table
),按'ID'分组,我们得到setDT(df1)
的值为“Number”。
min
或者也可以使用library(data.table)
setDT(df1)[, list(Number=min(Number)), by = ID]
到setorder
“数字”列进行此操作,并使用带有order
选项的unique
选择第一个非重复的“ID”行。 (来自@David Arenburgs的评论)
by
或者使用 unique(setorder(setDT(df1), Number), by = "ID")
,我们按“ID”进行分组,并使用dplyr
获取子集行。
summarise
或者我们可以使用library(dplyr)
df1 %>%
group_by(ID) %>%
summarise(Number= min(Number))
语法来获取数据子集。
sqldf
如果有多个列,并且您希望根据每个“ID”的“数字”的最小值获取行,则可以使用library(sqldf)
sqldf('select ID,
min(Number) as Number
from df1
group by ID')
。使用which.min
将获得行索引,并且可以用于对行进行子集化。
.I
或者使用setDT(df1)[df1[, .I[which.min(Number)], by = ID]$V1]
我们使用dplyr
过滤掉每个'ID'的slice
值为'Number'的行
min
答案 1 :(得分:2)
或者
do.call(rbind,
lapply(split(df1, df1$ID), function(x) subset(x, Number == min(Number))))
#ID Number
#10 10 180
#12 12 135
#15 15 133