如何将数据框子集化,只保留第一个重复项?

8

我有一个包含多个变量的数据框,我想知道如何对其进行子集操作,以便只包含第一个重复项。

    >head(occurrence)
    userId        occurrence  profile.birthday profile.gender postDate count
    1 100469891698         6               47         Female 583 days     0
    2 100469891698         6               47         Female  55 days     0
    3 100469891698         6               47         Female 481 days     0
    4 100469891698         6               47         Female 583 days     0
    5 100469891698         6               47         Female 583 days     0
    6 100469891698         6               47         Female 583 days     0

在这里您可以看到数据框。'occurrence'列计算了相同userId出现的次数。我尝试使用以下代码来删除重复项:

    occurrence <- occurrence[!duplicated(occurrence$userId),]

然而,这种方式会删除“随机”的重复数据。我想保留发表日期最早的数据。因此,例如第一行应该像这样:
   userId        occurrence  profile.birthday profile.gender postDate count
  1 100469891698         6               47         Female 583 days     0

感谢您的帮助!

5
欢迎来到 Stack Overflow。duplicated 函数将除第一个以外的所有出现都标记为 TRUE(不随机)。但是,您的数据可能没有按 postDate 倒序排列,因此您需要在调用之前对其进行排序或使用按 postDate 分组并仅保留每个 userId 的一行的替代方法(您可以在 SO Q&A 中找到执行此操作的代码示例)。 - Cath
2个回答

5
你是否尝试过按照以下方式首先下订单:
occurrence <- occurrence[order(occurrence$userId, occurrence$postDate, decreasing=TRUE),]
occurrenceClean <- occurrence[!duplicated(occurrence$userId),]
occurrenceClean

4

您可以使用dplyr来完成此操作,首先在最大postDate上过滤,然后使用distinct(unique)来删除所有重复行。当然,如果max postDate的行有所不同,您将获得所有这些记录。

occurrence <- occurrence %>% 
  group_by(userId) %>% 
  filter(postDate == max(postDate)) %>% 
  distinct

  occurence
# A tibble: 1 x 6
# Groups:   userId [1]
        userId occurrence profile.birthday profile.gender postDate count
         <dbl>      <int>            <int> <chr>          <chr>    <int>
1 100469891698          6               47 Female         583 days     0

1
使用dplyr::group_by(ocurrence, userId) %>% mutate(row_number() == 1),可以选择任意一条记录。值为1则会选择第一条记录,如果选择2则会选择第二条。 - seakyourpeak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接