![](/img/trans.png)
[英]Find duplicated rows based on 2 columns and selecte the first and last rows in Data Frame
[英]Find duplicated rows (based on 2 columns) in Data Frame in R
我在 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 中有一个函数吗?
您始终可以尝试简单地将前两列传duplicated
的函数:
duplicated(dat[,1:2])
假设您的数据框称为dat
。 有关更多信息,我们可以通过在控制台输入?duplicated
来查阅duplicated
函数的帮助文件。 这将提供以下句子:
确定向量或数据框的哪些元素是具有较小下标的元素的重复项,并返回一个逻辑向量,指示哪些元素(行)是重复项。
所以duplicated
返回一个逻辑向量,然后我们可以使用它来提取dat
的子集:
ind <- duplicated(dat[,1:2])
dat[ind,]
或者您可以跳过单独的分配步骤并简单地使用:
dat[duplicated(dat[,1:2]),]
dplyr 对于这种事情要好得多:
library(dplyr)
yourDataFrame %>%
distinct(RIC, Date, .keep_all = TRUE)
(“.keep_all 是可选的。如果不使用,它将只返回删除后的 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
如果要根据数据集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)
我认为您正在寻找的是一种以与原始数据相同的格式返回重复行的数据框的方法。 可能有一种更优雅的方法来做到这一点,但这有效:
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`
获取所需信息的简单方法是使用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
使用dup_id
(例如filter(dup_id == 1)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.