web-dev-qa-db-ja.com

Rのデータフレームで重複した行(2列に基づく)を検索する

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と日付の組み合わせに関して重複があるかどうかを知りたい。 Rにそのための関数はありますか?

28
user802231

最初の2つの列を関数duplicatedに渡すだけで、いつでも試すことができます。

duplicated(dat[,1:2])

データフレームがdatであると仮定します。詳細については、コンソールで?duplicatedと入力して、duplicated関数のヘルプファイルを参照してください。これにより、次の文が提供されます。

ベクトルまたはデータフレームのどの要素が小さい添え字を持つ要素の複製であるかを判別し、どの要素(行)が複製であるかを示す論理ベクトルを返します。

したがって、duplicatedは論理ベクトルを返し、これを使用してdatのサブセットを抽出できます。

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

または、個別の割り当て手順をスキップして、単に次のように使用できます。

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

dplyrはこの種のものにとても良いです:

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

( ".keep_allはオプションです。使用しない場合、重複排除された2列のみが返されます。使用すると、重複排除されたデータフレーム全体が返されます)

10
Guy Manova

Dataset data.frameのColumns DateおよびStateの値に基づいて重複レコードを削除する場合:

#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
Saurabh Jain

あなたが探しているのは、複製された行のデータフレームを元のデータと同じ形式で返す方法だと思います。これを行うにはよりエレガントな方法がおそらくありますが、これは機能します。

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`
2
Peter Geissert

2つ(またはそれ以上)の列に基づいて重複にタグを付けるためのdplyrオプションを次に示します。この場合、ricおよびdate

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 
0
sbha