ann*_*rey 69 r duplicates dataframe
R中复制的函数执行重复行搜索.如果我们想要删除重复项,我们只需要编写df[!duplicated(df),]
,重复项将从数据框中删除.
但是如何找到重复数据的索引呢?如果duplicated
在某行上返回TRUE,则意味着这是数据帧中第二次出现这样的行,并且可以很容易地获得其索引.如何获得该行首次出现的索引?或者,换句话说,重复行与之相同的索引?
我可以在data.frame上做一个循环,但我认为这个问题有一个更优雅的答案.
Sve*_*ein 95
这将返回逻辑索引向量:
duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1))
duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]
#[1] TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
which(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1])
#[1] 1 2 4 5 8 9 10
Run Code Online (Sandbox Code Playgroud)
更新(基于注释):
如果fromLast = TRUE
用作函数参数,则可以减少命令的复杂性.这比创建两个反向向量更容易.
duplicated(df) | duplicated(df, fromLast = TRUE)
duplicated(df) | duplicated(df, fromLast = TRUE)
#[1] TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
该功能duplicated
以相反的行顺序应用于原始数据帧和数据帧.后者的输出再次逆转.请注意,原始数据中第一次出现的重复值是反转版本中的最后一次出现.此后,这两个向量使用组合|
由于TRUE
它们中的至少一个表示重复的值.
mne*_*nel 18
如果您使用的是键控 data.table,则可以使用以下优雅语法
library(data.table)
DT <- data.table(A = rep(1:3, each=4),
B = rep(1:4, each=3),
C = rep(1:2, 6), key = "A,B,C")
DT[unique(DT[duplicated(DT)]),which=T]
Run Code Online (Sandbox Code Playgroud)
打开包装
DT[duplicated(DT)]
子集那些重复的行.
unique(...)
仅返回重复行的唯一组合.这涉及任何重复超过1的案例(重复重复,例如重复等)
DT[..., which = T]
将重复的行与原始行合并,并which=T
返回行号(没有which = T
它只会返回数据).
你也可以用
DT[,count := .N,by = list(A,B,C)][count>1, which=T]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
79411 次 |
最近记录: |