在 R 的数据框中查找重复的行(基于 2 列)

Posted

技术标签:

【中文标题】在 R 的数据框中查找重复的行(基于 2 列)【英文标题】:Find duplicated rows (based on 2 columns) in Data Frame in R 【发布时间】:2011-10-22 15:12:39 【问题描述】:

我在 R 中有一个数据框,如下所示:

| RIC    | Date                | Open   |
|--------|---------------------|--------|
| S1A.PA | 2011-06-30 20:00:00 | 23.7   |
| ABC.PA | 2011-07-03 20:00:00 | 24.31  |
| EFG.PA | 2011-07-04 20:00:00 | 24.495 |
| S1A.PA | 2011-07-05 20:00:00 | 24.23  |

我想知道关于 RIC 和 Date 的组合是否有任何重复。在 R 中有这样的功能吗?

【问题讨论】:

【参考方案1】:

您总是可以尝试简单地将前两列传递给函数duplicated

duplicated(dat[,1:2])

假设您的数据框名为dat。有关更多信息,我们可以通过在控制台输入?duplicated 来查阅duplicated 函数的帮助文件。这将提供以下句子

确定向量或数据框的哪些元素是重复的 具有较小下标的元素,并返回一个逻辑向量 指示哪些元素(行)是重复的。

所以duplicated 返回一个逻辑向量,然后我们可以使用它来提取dat 的子集:

ind <- duplicated(dat[,1:2])
dat[ind,]

或者您可以跳过单独的分配步骤并简单地使用:

dat[duplicated(dat[,1:2]),]

【讨论】:

如何检索重复的行?不知道重复函数的结果是怎么索引的。 @user802231 - 已编辑以解决您的进一步查询。 我试过了,但结果似乎不正确。我得到的如下所示:(每行前面的数字是行名)RIC Date 107515 7541.T 2011-06-30 20:00:00 107516 7541.T 2011-07-03 20:00:00 107517 7541 .T 2011-07-04 20:00:00 107518 7541.T 2011-07-05 20:00:00 107519 7541.T 2011-07-06 20:00:00 107520 7541.T 2011-07-07 20 :00:00 107521 7541.T 2011-07-10 20:00:00 107522 7541.T 2011-07-11 20:00:00 107523 7541.T 2011-07-12 20:00:00 107524 7541.T 2011-07-13 20:00:00 107525 7541.T 2011-07-14 20:00:00 107526 7541.T 2011-07-18 20:00:00 @user802231 有什么问题? 小心这个解决方案!!它只会为第 1 列和第 2 列的完全相同的 combination 返回 TRUE,如果数字反转则不会。换句话说:如果有另一个A,BA,B(即,如果它们分别是第 1 列和第 2 列的值)将被标记为重复,但如果有 @,则 不是 987654333@【参考方案2】:

dplyr 对于这类事情要好得多:

library(dplyr)
yourDataFrame %>%
    distinct(RIC, Date, .keep_all = TRUE)

(“.keep_all 是可选的。如果不使用,它将只返回去重的 2 列。使用时,它返回去重的整个数据帧)

【讨论】:

如果你只想知道是否存在重复值,你会怎么做? 虽然这通常是一个有用的技巧,但它不能回答 OP 发布的问题,即人们如何识别重复的观察结果。【参考方案3】:

这是一个dplyr 选项,用于根据两列(或更多列)标记重复项。在这种情况下ricdate

df <- data_frame(ric = c('S1A.PA', 'ABC.PA', 'EFG.PA', 'S1A.PA', 'ABC.PA', 'EFG.PA'),
                 date = c('2011-06-30 20:00:00', '2011-07-03 20:00:00', '2011-07-04 20:00:00', '2011-07-05 20:00:00', '2011-07-03 20:00:00', '2011-07-04 20:00:00'),
                 open = c(23.7, 24.31, 24.495, 24.23, 24.31, 24.495))

df %>% 
  group_by(ric, date) %>% 
  mutate(dupe = n()>1)
# A tibble: 6 x 4
# Groups:   ric, date [4]
  ric    date                 open dupe 
  <chr>  <chr>               <dbl> <lgl>
1 S1A.PA 2011-06-30 20:00:00  23.7 FALSE
2 ABC.PA 2011-07-03 20:00:00  24.3 TRUE 
3 EFG.PA 2011-07-04 20:00:00  24.5 TRUE 
4 S1A.PA 2011-07-05 20:00:00  24.2 FALSE
5 ABC.PA 2011-07-03 20:00:00  24.3 TRUE 
6 EFG.PA 2011-07-04 20:00:00  24.5 TRUE 

【讨论】:

【参考方案4】:

获取所需信息的简单方法是使用dplyr

yourDF %>% 
  group_by(RIC, Date) %>% 
  mutate(num_dups = n(), 
         dup_id = row_number()) %>% 
  ungroup() %>% 
  mutate(is_duplicated = dup_id > 1)

使用这个:

num_dups 告诉您该特定组合重复了多少次 dup_id 告诉您该特定行是哪个重复编号(例如,第 1、第 2 或第 3 等) is_duplicated 为您提供了一个简单的条件,您可以稍后过滤以删除所有重复的行(例如filter(!is_duplicated)),但您也可以为此使用dup_id(例如filter(dup_id == 1)

【讨论】:

【参考方案5】:

如果您想根据 dataset data.frame 中 DateState 列的值删除重复记录:

#Indexes of the duplicate rows that will be removed: 
duplicate_indexes <- which(duplicated(dataset[c('Date', 'State')]),) 
duplicate_indexes 

#new_uniq will contain unique dataset without the duplicates. 
new_uniq <- dataset[!duplicated(dataset[c('Date', 'State')]),] 
View(new_uniq) 

【讨论】:

【参考方案6】:

我认为您正在寻找的是一种以与原始数据相同的格式返回重复行的数据框的方法。可能有一种更优雅的方法可以做到这一点,但这很有效:

dup <- data.frame(as.numeric(duplicated(df$var))) #creates df with binary var for duplicated rows
colnames(dup) <- c("dup") #renames column for simplicity
df2 <- cbind(df, dup) #bind to original df
df3 <- subset(df2, dup == 1) #subsets df using binary var for duplicated`

【讨论】:

以上是关于在 R 的数据框中查找重复的行(基于 2 列)的主要内容,如果未能解决你的问题,请参考以下文章

删除另一个数据框中的行[重复]

如何从R中的数据框中删除重复的行[重复]

根据R中的2列删除重复的行

合并数据框中的行[重复]

折叠 Pandas 数据框中的行,每列具有不同的逻辑 [重复]

r 从包含 2 列组合的副本的数据框中删除行 [重复]