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

sg2wtvxw  于 2023-10-13  发布在  其他
关注(0)|答案(7)|浏览(114)

我在R中有一个 Dataframe ,它看起来像:

| 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中有这样的函数吗?

xxslljrj

xxslljrj1#

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

duplicated(dat[,1:2])

假设您的 Dataframe 名为dat。有关更多信息,我们可以通过在控制台键入?duplicated来查阅duplicated函数的帮助文件。这将提供以下句子:
确定向量或数据框的哪些元素是具有较小下标的元素的重复项,并返回一个逻辑向量,指示哪些元素(行)是重复项。
所以duplicated返回一个逻辑向量,然后我们可以使用它来提取dat的子集:

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

或者您可以跳过单独的赋值步骤,只需用途:

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

bt1cpqcv2#

dubir对这种事情更好:

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

(the“.keep_all是可选的。如果未使用,它将仅返回已消除重复数据的2列。使用时,它返回已消除重复数据的整个 Dataframe )

xxhby3vn

xxhby3vn3#

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

hmmo2u0o4#

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

library(dplyr)

yourDF %>% 
  group_by(RIC, Date) %>% 
  mutate(num_dups = n(), 
         dup_id = row_number()) %>% 
  ungroup() %>% 
  mutate(is_duplicated = dup_id > 1)
# A tibble: 6 × 6
  RIC    Date                 open num_dups dup_id is_duplicated
  <chr>  <chr>               <dbl>    <int>  <int> <lgl>        
1 S1A.PA 2011-06-30 20:00:00  23.7        1      1 FALSE        
2 ABC.PA 2011-07-03 20:00:00  24.3        2      1 FALSE        
3 EFG.PA 2011-07-04 20:00:00  24.5        2      1 FALSE        
4 S1A.PA 2011-07-05 20:00:00  24.2        1      1 FALSE        
5 ABC.PA 2011-07-03 20:00:00  24.3        2      2 TRUE         
6 EFG.PA 2011-07-04 20:00:00  24.5        2      2 TRUE

使用这个:

  • num_dups告诉您特定组合重复的次数
  • dup_id告诉您特定行是哪个重复的数字(例如,第一、第二或第三等)
  • is_duplicated为您提供了一个简单的条件,您可以在稍后进行过滤以删除所有重复的行(例如,filter(!is_duplicated)),不过你也可以使用dup_id(例如,filter(dup_id == 1)
chy5wohz

chy5wohz5#

如果您希望根据datasetdata.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)
ffx8fchx

ffx8fchx6#

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

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`
nbnkbykc

nbnkbykc7#

发现了Steve Lianouglou发布的一个非常巧妙的想法,它有助于解决这个问题,并具有索引重复的巨大优势:
如果生成一个hash列,该列连接要检查重复项的两个列,则可以使用dplyr::n()seq为每个重复项给予索引,如下所示

dat %>% mutate(hash = str_c(RIC, Date)) %>%
  group_by(hash) %>% 
  mutate(duplication_id = seq(n()) %>%
 ungroup ()

duplication_id告诉你在你的表中有多少相同的行(两列的行值相同)在索引的上面。我用这个来删除重复的ID。

相关问题