我想根据列'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
我使用复制功能失败了。
任何帮助将不胜感激!谢谢!
答案 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选择)
反正)我希望我做对了。 :)