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

dldeef67  于 2023-11-14  发布在  其他
关注(0)|答案(3)|浏览(168)

我想删除基于列“用户”的重复项,但只删除它出现的第一个示例。
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


我一直没有成功地使用重复的功能。
任何帮助将不胜感激!谢谢!

wf82jlnq

wf82jlnq1#

如果我没理解错的话,这应该可以

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

字符串
duplicated()会告诉你一个值是否已经被看到过,但是它在第一次看到一个值时返回“0”(它还没有被复制),然后在每次看到这个值时返回“TRUE”。为了不删除只有一行的值,我们也保留了每组总行数n()为1的值。

vbopmzt1

vbopmzt12#

下面是一个使用data.table的选项。我们将“data.frame”转换为“data.table”(setDT(DF))。按“用户”列分组,我们选择除第一行之外的所有行(tail(.SD, -1))其中.SDSubset of Data.table。但是,如果“User”组只有一行,则也会删除该行。我们可以通过使用if/else条件来避免这种情况,该条件声明if的行数大于1(.N>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

字符串
或者,@MrFlick的dplyr代码中的类似选项将使用逻辑条件duplicated.N(行数)。我们通过检查具有单个观察的“用户”组来创建列“N(.N==1),则在下一步骤,我们对N为TRUE或'User'为duplicated的数据列建立子集。duplicated会传回duplicate个数据列的TRUE值,并留下第一个值表示为FALSE

setDT(DF)[DF[, N:=.N==1, by = User][, N|duplicated(User)]][,N:=NULL][]


或者,base R选项会使用ave来取得逻辑索引('indx 2'),方法是检查每个'User'群组的length是否为1。我们可以使用此沿着duplicated(如上所述)来设定数据集的子集。

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

4si2a6ki

4si2a6ki3#

这不像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选择)

我希望我做对了:)

相关问题