有条件地删除R中的行

时间:2015-06-15 17:44:16

标签: r conditional delete-row

我有一个数据,第一列是一堆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行并删除其余的

2 个答案:

答案 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