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

use*_*231 22 r duplicates dataframe

我在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  |
Run Code Online (Sandbox Code Playgroud)

我想知道是否有关于RIC和Date组合的重复.R中是否有功能?

jor*_*ran 44

您始终可以尝试将前两列传递给函数duplicated:

duplicated(dat[,1:2])
Run Code Online (Sandbox Code Playgroud)

假设您的数据框被调用dat.有关更多信息,我们可以duplicated通过?duplicated在控制台输入来查阅该功能的帮助文件.这将提供以下句子:

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

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

ind <- duplicated(dat[,1:2])
dat[ind,]
Run Code Online (Sandbox Code Playgroud)

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

dat[duplicated(dat[,1:2]),]
Run Code Online (Sandbox Code Playgroud)


Guy*_*ova 10

dplyr对于这类事情来说更好:

library(dplyr)
yourDataFrame %>%
    distinct(RIC, Date, .keep_all = TRUE)
Run Code Online (Sandbox Code Playgroud)

(".keep_all是可选的.如果不使用,它将仅返回重复的2列.使用时,它返回重复数据删除的整个数据框)

  • 虽然这通常是一个有用的技巧,但它并没有回答 OP 发布的问题,即人们如何识别重复的观察结果。 (5认同)
  • 如果您只想知道是否存在重复值,该怎么办? (2认同)

Bra*_*don 10

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

\n
library(dplyr)\n\nyourDF %>% \n  group_by(RIC, Date) %>% \n  mutate(num_dups = n(), \n         dup_id = row_number()) %>% \n  ungroup() %>% \n  mutate(is_duplicated = dup_id > 1)\n# A tibble: 6 \xc3\x97 6\n  RIC    Date                 open num_dups dup_id is_duplicated\n  <chr>  <chr>               <dbl>    <int>  <int> <lgl>        \n1 S1A.PA 2011-06-30 20:00:00  23.7        1      1 FALSE        \n2 ABC.PA 2011-07-03 20:00:00  24.3        2      1 FALSE        \n3 EFG.PA 2011-07-04 20:00:00  24.5        2      1 FALSE        \n4 S1A.PA 2011-07-05 20:00:00  24.2        1      1 FALSE        \n5 ABC.PA 2011-07-03 20:00:00  24.3        2      2 TRUE         \n6 EFG.PA 2011-07-04 20:00:00  24.5        2      2 TRUE  \n
Run Code Online (Sandbox Code Playgroud)\n

使用这个:

\n
    \n
  • num_dups告诉您特定组合重复了多少次
  • \n
  • dup_id告诉您特定行是哪个重复数字(例如第一、第二或第三等)
  • \n
  • is_duplicated为您提供了一个简单的条件,您可以稍后过滤以删除所有重复的行(例如filter(!is_duplicated)),尽管您也可以用于dup_id此目的(例如filter(dup_id == 1)
  • \n
\n


sbh*_*bha 8

这是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 
Run Code Online (Sandbox Code Playgroud)