查找数据帧的重复行以及重复行在 R 中对应的原始行
Find the duplicated rows of a dataframe and which original row the duplicated row is corresponding in R
我的数据框如下所示:
data <- data.frame(a=c(3,1,2,2,2,3),b=c(3,1,1,2,2,3))
duplicated(data)
[1] FALSE FALSE FALSE FALSE TRUE TRUE
我要的不仅是表示哪一行重复的逻辑字符串,还需要重复的行对应的原始行。在上面的示例中,第五行是原始数据框中第四行的副本,第六行是原始数据框中第一行的副本。所以我想要一个像这样的索引向量:
NA NA NA NA 4 1
(NA 表示非重复行)。
我天真的做法是:
dupTF <- duplicated(data)
DupDat <- data[dupTF,]
index0 <- rep(NA,nrow(DupDat))
for (i in 1 : nrow(DupDat))
{
for (j in 1 : nrow(data))
{
if(all(data[j,] == DupDat[i,])) break;
}
index0[i] <- j
}
index <- rep(NA,length(dupTF))
index[dupTF]<- index0
index
[1] NA NA NA NA 4 1
但是,这种方法并不理想,因为它遍历了所有数据...
我可能会使用 data.table,因为它的 .I
和 .N
变量(可从每个 by
组)让它变得如此简单:
library(data.table)
dt <- data.table(data)
dt[, XX:=c(NA, rep(.I[1], .N-1)), by=c("a","b")][,XX]
# [1] NA NA NA NA 4 1
我的数据框如下所示:
data <- data.frame(a=c(3,1,2,2,2,3),b=c(3,1,1,2,2,3))
duplicated(data)
[1] FALSE FALSE FALSE FALSE TRUE TRUE
我要的不仅是表示哪一行重复的逻辑字符串,还需要重复的行对应的原始行。在上面的示例中,第五行是原始数据框中第四行的副本,第六行是原始数据框中第一行的副本。所以我想要一个像这样的索引向量:
NA NA NA NA 4 1
(NA 表示非重复行)。
我天真的做法是:
dupTF <- duplicated(data)
DupDat <- data[dupTF,]
index0 <- rep(NA,nrow(DupDat))
for (i in 1 : nrow(DupDat))
{
for (j in 1 : nrow(data))
{
if(all(data[j,] == DupDat[i,])) break;
}
index0[i] <- j
}
index <- rep(NA,length(dupTF))
index[dupTF]<- index0
index
[1] NA NA NA NA 4 1
但是,这种方法并不理想,因为它遍历了所有数据...
我可能会使用 data.table,因为它的 .I
和 .N
变量(可从每个 by
组)让它变得如此简单:
library(data.table)
dt <- data.table(data)
dt[, XX:=c(NA, rep(.I[1], .N-1)), by=c("a","b")][,XX]
# [1] NA NA NA NA 4 1