R 识别具有不同ID的重复项

R 识别具有不同ID的重复项,r,R,我有以下数据: set.seed(26312) id <- rep(c(1, 2, 3, 4, 5), each = 9) wrc <- round(runif(36, 20, 100)) wrc <- c(wrc, wrc[10:18]) x <- rep(1:9, 5) dat <- data.frame(id, wrc, x) 我有一个更大的数据集,有4321个ID,我想删除这些重复项,因为即使它们有不同的ID,它们确实是重复项 目前,我正在为()和whil

我有以下数据:

set.seed(26312)
id <- rep(c(1, 2, 3, 4, 5), each = 9)
wrc <- round(runif(36, 20, 100))
wrc <- c(wrc, wrc[10:18])
x <- rep(1:9, 5)
dat <- data.frame(id, wrc, x)
我有一个更大的数据集,有4321个ID,我想删除这些重复项,因为即使它们有不同的ID,它们确实是重复项

目前,我正在为()和
while()
循环做一系列非常糟糕和非常慢的
循环。在英语中,代码所做的是子集一个id,然后将该id与我在while循环中子集的其他id进行比较。当我发现一个副本时,意味着所有数据行都是相同的,它应该丢弃第一个重复的id。由此产生的
cleaned_data
正是我想要的,只是到达那里的速度太慢了,令人无法忍受。因为当我有4321个ID时,进行比较大约需要1分钟,所以运行这个糟糕的循环大约需要4321分钟。有人能帮忙吗

library("dplyr")
id_check = 1:5
cleaned_data <- data.frame()
for(i in id_check){
  compare_tmp <- dat %>% filter(id == i) 
  compare_check <- compare_tmp %>% select(wrc, x)
  duplicate = FALSE
  if(i == length(id_check)){
    cleaned_data <- rbind(cleaned_data, compare_tmp)
    break
  } else {
    id_tmp = i + 1
  }
  while(duplicate == FALSE){
    check <- dat %>% filter(id == id_tmp) %>% select(wrc, x)
    if(nrow(check) == 0) break
    duplicate = identical(compare_check, check)
    id_tmp = id_tmp + 1
    if(id_tmp == (length(id_check) + 1)) {
      break
    }
  }
  if(duplicate == FALSE){
    cleaned_data <- rbind(cleaned_data, compare_tmp)
  } 
}
cleaned_data
库(“dplyr”)
id_检查=1:5

清理的_数据可能大致如下:

do.call(
  rbind,
  split(dat, dat$id)[!duplicated(lapply(split(dat[2:3], dat$id), `rownames<-`, NULL), fromLast = TRUE)]
)

也许是这样的:

do.call(
  rbind,
  split(dat, dat$id)[!duplicated(lapply(split(dat[2:3], dat$id), `rownames<-`, NULL), fromLast = TRUE)]
)

如果列结构准确,则可以转换为宽格式以进行重复检测:

dat_wide = reshape2::dcast(dat, id ~ x, value.var = "wrc")
dupes = dat_wide$id[duplicated(dat_wide[-1], fromLast = T)]

no_dupes = dat[!dat$id %in% dupes, ]

如果列结构准确,则可以转换为宽格式以进行重复检测:

dat_wide = reshape2::dcast(dat, id ~ x, value.var = "wrc")
dupes = dat_wide$id[duplicated(dat_wide[-1], fromLast = T)]

no_dupes = dat[!dat$id %in% dupes, ]

三天之内使用
tidyr

library(tidyr)
library(dplyr)

as_tibble(dat) %>% 
  nest(-id) %>%
  filter(!duplicated(data, fromLast = TRUE)) %>% 
  unnest()

# # A tibble: 36 x 3
#       id   wrc     x
#    <dbl> <dbl> <int>
#  1     1    53     1
#  2     1    44     2
#  3     1    70     3
#  4     1    31     4
#  5     1    67     5
#  6     1    50     6
#  7     1    70     7
#  8     1    40     8
#  9     1    52     9
# 10     3    95     1
# # ... with 26 more rows
library(tidyr)
图书馆(dplyr)
不稳定(dat)%>%
嵌套(-id)%%>%
筛选器(!duplicated(数据,fromLast=TRUE))%>%
unnest()
##tibble:36 x 3
#id wrc x
#      
#  1     1    53     1
#  2     1    44     2
#  3     1    70     3
#  4     1    31     4
#  5     1    67     5
#  6     1    50     6
#  7     1    70     7
#  8     1    40     8
#  9     1    52     9
# 10     3    95     1
# # ... 还有26行

(注意:不确定关于多个答案的Stackoverflow策略,但这一个不同到应该有一个单独的答案IMHO(如果不是,请这样说,我将编辑我的初始答案并删除这一个)。

使用
tidyr

library(tidyr)
library(dplyr)

as_tibble(dat) %>% 
  nest(-id) %>%
  filter(!duplicated(data, fromLast = TRUE)) %>% 
  unnest()

# # A tibble: 36 x 3
#       id   wrc     x
#    <dbl> <dbl> <int>
#  1     1    53     1
#  2     1    44     2
#  3     1    70     3
#  4     1    31     4
#  5     1    67     5
#  6     1    50     6
#  7     1    70     7
#  8     1    40     8
#  9     1    52     9
# 10     3    95     1
# # ... with 26 more rows
library(tidyr)
图书馆(dplyr)
不稳定(dat)%>%
嵌套(-id)%%>%
筛选器(!duplicated(数据,fromLast=TRUE))%>%
unnest()
##tibble:36 x 3
#id wrc x
#      
#  1     1    53     1
#  2     1    44     2
#  3     1    70     3
#  4     1    31     4
#  5     1    67     5
#  6     1    50     6
#  7     1    70     7
#  8     1    40     8
#  9     1    52     9
# 10     3    95     1
##…还有26行

(注意:不确定关于多个答案的Stackoverflow策略,但这一个不同到应该有一个单独的答案IMHO(如果不是,请这样说,我将编辑我的初始答案并删除此答案).

您的实际数据是否有更多的列?或者这个示例是否现实,因为有一个id列、一个id内索引和一个单值列?“如果我运行dat[!duplicated(dat[2:3]),它会在不应该的时候删除ID5。”它删除了ID 5,因为第一行ID1与ID5中的第一行完全相同。这不是你想要的吗?@Hakki不,这是一个分组重复数据消除。
wrc
x
列(其中
ID=5
wrc
x
列(其中
ID=2
)相同,因此整个
ID=2
组应该被删除,整个
ID=5
组应该被保留。啊,明白了。抱歉这么愚蠢。事实上,我本来想保留
ID=2
ID=5
,并且有更多的数据列。但是,下面的@Gregor响应似乎为我做了这件事。你的真实数据有更多的列吗?或者这是ex“如果我运行dat[!duplicated(dat[2:3]),它会删除ID5,而它不应该删除它。”它删除了ID 5,因为第一行ID1与ID5中的第一行完全相同。这不是你想要的吗?@Hakki不,这是一个分组重复数据消除。
wrc
x
列(其中
ID=5
wrc
x
列(其中
ID=2
)相同,因此整个
ID=2
组应该被删除,整个
ID=5
组应该被保留。啊,明白了。抱歉这么愚蠢。事实上,我本来想保留
ID=2
ID=5
,而且还有更多的数据列。然而,下面的@Gregor响应似乎为我做了这件事。哇。解决方案太明显了,伤了我的头。哇w、 这个解决方案太明显了,弄痛了我的头。完全不同!完全不同!