【问题标题】:How to retain one of the duplicated rows randomly in r (not the first duplicated row)如何在 r 中随机保留一个重复的行(不是第一个重复的行)
【发布时间】:2021-05-13 23:10:10
【问题描述】:

我有一个包含许多重复行的大型数据集。我想删除重复的行并只保留唯一的行。但是我不想保留第一个重复的行,dplyr::distinct() 就是这种情况。我想要的是,例如,如果有三行具有相似的答案,我希望 r 随机保留其中一个(并不总是第一个重复的行)。

例如,如果我的数据框如下所示:

ID<-c(1:10)
age<-c(18,18,19,19,19,20,20,20,21,21)
Answer1<-c("yes", "yes", "no", "no", "no", "no", "no", "yes", "no", "no")
Answer2<-c("yes", "yes", "no", "no", "no", "no", "no", "yes", "yes", "no")

df<-data.frame(ID, age, Answer1, Answer2)
print(df)

ID age Answer1 Answer2
1  18     yes     yes
2  18     yes     yes
3  19      no      no
4  19      no      no
5  19      no      no
6  20      no      no
7  20      no      no
8  20     yes     yes
9  21      no     yes
10 21      no      no

那些年龄相同的人加上第一个和第二个答案匹配的人,我认为他们是重复的,我想随机保留其中一个(并删除其余的)。我尝试了以下dplyr 命令。问题是该命令保留了第一个重复的行。

df.new<-df%>%
  group_by(age) %>%
  distinct(Answer1, Answer2,.keep_all = TRUE) 

是否有一个简单的命令可以随机保留重复的行之一?

如果这不可能,您知道我如何创建额外的列来指示个人是唯一的还是重复的(类似这样)

   ID age Answer1 Answer2    Status
1  18     yes     yes        duplicate
2  18     yes     yes        duplicate
3  19      no      no        duplicate
4  19      no      no        duplicate
5  19      no      no        duplicate
6  20      no      no        duplicate
7  20      no      no        duplicate
8  20     yes     yes           unique
9  21      no     yes           unique
10 21      no      no           unique

请注意,如果数据集中至少有一个年龄相似的人,Answer1 和 Answer2,则此人会获得重复状态。

【问题讨论】:

    标签: r dataframe dplyr duplicates aggregate


    【解决方案1】:

    无需担心重复,您可以为ageAnswer1Answer2 的每个唯一值选择一个随机行。

    library(dplyr)
    df %>% group_by(age, Answer1, Answer2) %>% slice_sample(n = 1)
    #With sample_n
    #df %>% group_by(age, Answer1, Answer2) %>% sample_n(1)
    

    如果组中只有 1 行,则默认选择该行。

    【讨论】:

      【解决方案2】:

      使用data.table

      library(data.table)
      setDT(df)[, .SD[sample(seq_len(.N), 1)], .(age, Answer1, Answer2)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 2015-10-26
        • 1970-01-01
        • 2011-08-31
        • 2018-01-15
        相关资源
        最近更新 更多