r - 有条件地删除R中的行

标签 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行,然后删除其余的行

最佳答案

为了为每个“ID”组选择具有最小“Number”的行,我们可以使用“按组聚合”功能之一。 base R选项是aggregate。使用aggregate,我们可以使用'formula'方法,也可以使用list参数指定分组元素/变量的by。使用formula方法,我们为每个“ID”获取min值“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在“Number”列中使用order并使用uniqueby选项来选择第一个非重复的“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过滤出每个'ID'的min值为'Number'的行
df1 %>% 
    group_by(ID) %>%
    slice(which.min(Number))

关于r - 有条件地删除R中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30851627/

相关文章:

R ggplot2 两级构面包裹

pandas - 从时间索引数据框中删除一行

mysql - 使用左连接时不会删除行

php - 在条件 (if) 语句中使用 CodeCeption 断言

php - 多行id相同时如何删除一行

r - 获得连续数据(R)频率表的更好方法?

r - 使用 R 中的数据掩码评估最大似然表达式

r - 在使用 R 查询之前从 SQLite 数据库附加两个表

php - 如何在 explode() 函数中使用条件?

python - 如何根据数据类型在 python 中设置条件?