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

时间:2011-08-08 18:19:19

标签: 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  |

我想知道是否有关于RIC和Date组合的重复内容。 R中是否有函数?

6 个答案:

答案 0 :(得分:39)

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

duplicated(dat[,1:2])

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

  

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

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

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

或者您可以跳过单独的分配步骤,只需使用:

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

答案 1 :(得分:9)

dplyr对于这类事情来说好多了:

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

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

答案 2 :(得分:3)

如果要根据数据集 data.frame中的日期状态列的值删除重复记录:

#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) 

答案 3 :(得分:2)

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

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`

答案 4 :(得分:0)

这里有一个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 

答案 5 :(得分:0)

获取所需信息的简便方法是使用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告诉您特定行是哪个重复编号(例如1st,2nd或3rd等)
  • is_duplicated为您提供了一个简单的条件,您可以稍后对其进行过滤以删除所有重复的行(例如filter(!is_duplicated)),尽管您也可以为此使用dup_id(例如{{1 }})