删除第一个重复行并保留其余行?

时间:2015-04-20 05:24:49

标签: r

我想根据列'User'删除重复项,但只删除它出现的第一个实例。

DF:

User  No
A     1
B     1
A     2
A     3
A     4
C     1
B     2
D     1

结果: (A1和B1删除)

User  No  
A     2
A     3
A     4
C     1
B     2
D     1

我使用复制功能失败了。

任何帮助将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:14)

如果我理解正确,这应该有效

library(dplyr)
dd %>% group_by(User) %>% filter(duplicated(User) | n()==1)

答案 1 :(得分:12)

以下是使用data.table的选项。我们将'data.frame'转换为'data.table'(setDT(DF))。通过“用户”列进行分组,我们选择除tail(.SD, -1).SD Subset of Data.table之外的第一行(if/else)以外的所有行。但是,如果“用户”组只有一行,这也将删除该行。我们可以通过使用if条件来说明.N>1行数大于1(else)来避免这种情况,我们删除第一行或.SD返回行(library(data.table) setDT(DF)[, if(.N>1) tail(.SD,-1) else .SD , by = User] # User No #1: A 2 #2: A 3 #3: A 4 #4: B 2 #5: C 1 #6: D 1 )。

duplicated

或者@ MrFlick的dplyr代码中的类似选项将使用.N.N==1(行数)的逻辑条件。我们通过选中具有单个观察值(duplicated)的“用户”组来创建列“N”,在下一步中,我们将对N为TRUE的行进行子集或为duplicated用户'。 TRUE返回duplicate行的FALSE值,第一个值为setDT(DF)[DF[, N:=.N==1, by = User][, N|duplicated(User)]][,N:=NULL][]

base R

或者ave选项将使用length来获取逻辑索引('indx2'),方法是检查每个'用户'组的duplicated是否为1。我们可以将此与indx2 <- with(DF, ave(seq_along(User), User, FUN=length)==1) DF[duplicated(DF$User)|indx2,] # User No #3 A 2 #4 A 3 #5 A 4 #6 C 1 #7 B 2 #8 D 1 一起使用,如上所述,对数据集进行子集化。

{{1}}

答案 2 :(得分:3)

这不像MrFlick和akrun的方法那么容易理解,但是是单行基础R解决方案

#data
DF=data.frame(User=c("A","B","A","A","A","C","B","D"),No=c(1,1,2,3,4,1,2,1))
#solution
subset(DF,duplicated(User)|!duplicated(User,fromLast=TRUE))

它给出了

#  User No
#3    A  2
#4    A  3
#5    A  4
#6    C  1
#7    B  2
#8    D  1

说明:

subset(DF,logicalA|logicalB)
  • logicalA ...选择所有重复的条目,因此省略 所有只有一个条目的用户
  • logicalB ...选择所有用户 只有一个条目并选择最后一个条目(参见fromLast=TRUE) 具有多行的用户(后者由logicalA选择) 反正)

我希望我做对了。 :)