如何在R中识别和删除具有多个条件的重复项

xurqigkl  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(108)

我想从我的数据集中识别并删除重复项。问题是我有两个不同的标准。首先,我使用的主要标准是最近的时间。但是,并非所有重复项都有日期。在缺少日期的情况下,我将不得不逐个检查以查看我要保留的行。因此,这是我需要的:
假设我有以下数据:

df <- data.frame(id = c("a", "a", "b","b", "c","c"),
                 date = c("2023-05-16", "2023-08-21", "2023-06-05", NA, "2023-05-07", "2023-05-20"))

library(lubridate)

df$date <- ymd(df$date)
class(df$date)

[1] "Date"

df

  id       date
1  a 2023-05-16
2  a 2023-08-21
3  b 2023-06-05
4  b       <NA>
5  c 2023-05-07
6  c 2023-05-20

字符串
首先,我需要识别所有包含NA的重复项,以比较行,并查看我将保留哪一行。我需要一个类似于此的结果框架,它包含重复项和唯一值:

id       date
1  b 2023-06-05
2  b       <NA>


请注意,我有两行,所以我可以比较它们。我保持示例简单,但我不确定在我的实际 Dataframe 上,每个id有多少重复。接下来,我将剩下的 Dataframe :

id       date
1  a 2023-05-16
2  a 2023-08-21
3  c 2023-05-07
4  c 2023-05-20


我只需要保留最新的值,我将以这样的方式结束:

id       date
1  a 2023-08-21
2  c 2023-05-20


如果有什么不清楚的地方,你需要更多的澄清,请告诉我。

gmxoilav

gmxoilav1#

第1部分:识别所有包含NA的副本,并将其保存在单独的df中以供审查:

#Ids of NA dates:
ids_na <- df |> filter(is.na(date)) |> pull(id)

#Dfs of duplicates with NA:
is_na <- df |> filter(id %in% ids_na)

is_na

# id       date
# b 2023-06-05
# b       <NA>

字符串
第2部分:保留重复值的最新条目

# Remove dupes with NAs from df
clean_df <- df |> filter(!(id %in% ids_na))
# Get the most recent by grouping 
unique_entries <- clean_df |> group_by(id) |>  summarise(date = max(date))
unique_entries

# A tibble: 2 × 2
# id    date      
# <chr> <date>    
#   a     2023-08-21
#   c     2023-05-20

nzk0hqpo

nzk0hqpo2#

我会使用一个标志而不是split。使用ave,你可以标记哪个id在日期中有anyNA,创建一个keep向量来子集有效或无效的id。使用which.max获取最新的日期。

> df <- transform(df, flag=ave(as.integer(date), id, FUN=anyNA))
> keep <- !df$flag == 1
> by(df[keep, ], df[keep, ]$id, \(x) x[which.max(x$date), ]) |> do.call(what='rbind')
  id       date flag
a  a 2023-08-21    0
c  c 2023-05-20    0
> df[!keep, ]
  id       date flag
3  b 2023-06-05    1
4  b       <NA>    1

字符串

更新

注意,从R4.3.0开始,我们可以在by中使用公式。

> by(df[keep, ], ~id, \(x) x[which.max(x$date), ]) |> do.call(what='rbind')
  id       date flag
a  a 2023-08-21    0
c  c 2023-05-20    0

  • 数据类型:*
> dput(df)
structure(list(id = c("a", "a", "b", "b", "c", "c"), date = structure(c(19493, 
19590, 19513, NA, 19484, 19497), class = "Date"), flag = c(0L, 
0L, 1L, 1L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-6L))

相关问题