我有一个数据,第一列是一堆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行,然后删除其余的行
为了选择每个“ ID”组具有最小“ Number”的行,我们可以使用按组聚合功能之一。一个base R
选项是aggregate
。使用aggregate
,我们可以使用“公式”方法,也可以通过参数指定list
分组元素/变量by
。使用该formula
方法,我们min
为每个“ ID”获得“ Number”的值。
aggregate(Number~ID, df1, FUN=min)
或者,我们可以对使用更快的选项data.table
。在这里,我们将“ data.frame”转换为“ data.table”(setDT(df1)
),并按“ ID”分组,得到min
“ Number”的值。
library(data.table)
setDT(df1)[, list(Number=min(Number)), by = ID]
或者,这可以与也做setorder
对order
了“数”栏,并使用unique
与by
选项,选择第一个非重复的“ID”行。(来自@David Arenburgs的评论)
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”的“ Number”的最小值来获取行,则可以使用which.min
。使用.I
将获取行索引,并且可以用于子集行。
setDT(df1)[df1[, .I[which.min(Number)], by = ID]$V1]
或者使用,dplyr
我们slice
可以过滤出min
每个“ ID”的值为“ Number”的行
df1 %>%
group_by(ID) %>%
slice(which.min(Number))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句