识别和标记R中的部分重复记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了识别和标记R中的部分重复记录相关的知识,希望对你有一定的参考价值。

我有一个包含数千(~12k)记录和多个(36)变量的数据框。为了提供一些背景,这些是对动物行为的观察。 20个变量记录了特定个体的存在与否(作为2个级别的因子)。

我想要实现的是创建一个额外的变量来标记存在/不存在变量的每个唯一组合。因此,如果我有以下简化数据集,其中X和Y记录感兴趣的变量(细节与问题无关)和三个人A,B,C(其中“ab”=缺席和“pr”=存在):

Date      Time    X    Y    A   B   C
17-12-01  10:15   2    4    pr  ab  pr
17-12-01  10:45   3    5    pr  ab  pr
17-12-01  11:15   2    4    ab  pr  pr
17-12-01  11:40   2    4    ab  pr  pr
17-12-01  11:15   6    7    ab  pr  ab
...

可能的独特组合是:

A    B    C
pr   pr   pr
pr   ab   ab
ab   pr   ab
ab   ab   pr
pr   pr   ab
ab   pr   pr
pr   ab   pr

[编辑:所有'ab'的组合 - 原则上 - 可能,但不会出现,因为所有人都将缺席 - 因此无法进行观察]

[编辑:]所需的输出:

Date      Time    X    Y    A   B   C     Combination
17-12-01  10:15   2    4    pr  ab  pr    1
17-12-01  10:45   3    5    pr  ab  pr    1
17-12-01  11:15   2    4    ab  pr  pr    2
17-12-01  11:40   2    4    ab  pr  pr    2
...                         ab  ab  pr    3    etc.  

我发现我可以创建一个新的数据框,使用distinct中的dplyr选择独特的组合:

newDF = distinct(oldDF, A, B, C, .keep_all = TRUE)

但是这会删除(或者更确切地说不包括在newDF中)重复项,而我想要做的是保留所有重复项,但只标记每个唯一组合(我可以找到的所有其他帖子和建议都与删除重复项有关),并且真实数据框有20个“个体”变量,而不仅仅是三个。

所以我的问题是:有没有办法使用distinct的输出来实现这一目标,还是我让自己陷入了一条死胡同,还需要另一种方法?

任何帮助非常感谢。

缺口

答案

OP要求创建一个附加变量,用于标记存在/不存在变量的每个唯一组合。他提供了一个包含三个不同变量的样本数据集和一个三个变量值的可能组合表。

要获得23 - 1种不同组合的不同数字,我们可以使用:

dt[, Combination := .GRP, by = .(A, B, C)][]

它按照出现的顺序对组合进行编号(.GRPdata.table语法中的特殊符号):

       Date  Time X Y  A  B  C Combination
1: 17-12-01 10:15 2 4 pr ab pr           1
2: 17-12-01 10:45 3 5 pr ab pr           1
3: 17-12-01 11:15 2 4 ab pr pr           2
4: 17-12-01 11:40 2 4 ab pr pr           2
5: 17-12-01 11:15 6 7 ab pr ab           3
6: 17-12-01 11:45 3 4 pr ab pr           1

请注意,OP提供的样本数据集已经过修改,以包含第6行,该行具有与行1和2相同的Combination编号。

另一答案

dplyr的一种方法:

df %>% 
  mutate(id = group_indices(., A, B, C))

      Date  Time X Y  A  B  C id
1 17-12-01 10:15 2 4 pr ab pr  3
2 17-12-01 10:45 3 5 pr ab pr  3
3 17-12-01 11:15 2 4 ab pr pr  2
4 17-12-01 11:40 2 4 ab pr pr  2
5 17-12-01 11:15 6 7 ab pr ab  1
6 17-12-01 11:45 3 4 pr ab pr  3
另一答案

以下是使用dplyr对您自己的方法进行的相对简单的扩展:

tab %>%
  left_join(distinct(tab, A, B, C, .keep_all = TRUE) %>%
              mutate(unique = "1"), suffix = c(".x", ".y"))

合并完整和不同的数据框,用不同的标签标记不同的数据框

#output:
      Date  Time X Y  A  B  C unique
1 17-12-01 10:15 2 4 pr ab pr      1
2 17-12-01 10:45 3 5 pr ab pr   <NA>
3 17-12-01 11:15 2 4 ab pr pr      1
4 17-12-01 11:40 2 4 ab pr pr   <NA>
5 17-12-01 11:15 6 7 ab pr ab      1

可以使用其他代码来替换NA

.... %>%
replace_na(list(unique = 0))

选项卡是:

tab = read.table(text = "Date      Time    X    Y    A   B   C
17-12-01  10:15   2    4    pr  ab  pr
17-12-01  10:45   3    5    pr  ab  pr
17-12-01  11:15   2    4    ab  pr  pr
17-12-01  11:40   2    4    ab  pr  pr
17-12-01  11:15   6    7    ab  pr  ab", header = T)

这是一个绩效衡量标准:

library(microbenchmark)
microbenchmark(tab %>%
                 left_join(distinct(tab, A, B, C, .keep_all = TRUE) %>%
                             mutate(unique = "1"), suffix = c(".x", ".y")) %>%
                 replace_na(list(unique = 0)),
tab %>%
  group_by(A, B, C) %>% 
  mutate(id = row_number(),
         label = case_when(id >= 2 ~ "duplicate",
                           TRUE ~ "unique")))

#output with 100000 rows: `tab <- tab[sample(1:5, 100000, replace = T),]`

     min        lq     mean   median       uq      max neval
 12.099989 12.564350 13.43444 12.88050 13.44687 34.73189   100
  9.374461  9.928966 11.62848 10.33991 11.57404 49.86249   100

#output with 1 million rows:

      min       lq     mean   median        uq      max neval
 83.26594 85.65350 94.57422 86.24378 105.48224 254.9932   100
 68.81993 88.88253 92.75600 91.22021  93.06835 255.9896   100

如此相似的表现

以上是关于识别和标记R中的部分重复记录的主要内容,如果未能解决你的问题,请参考以下文章

如何识别和标记特定列中的重复数据

在 ListFragment 中无法识别 findViewById [重复]

无法在每个活动上解析符号“R”[重复]

如何识别脚本中最耗时的部分

如何识别哪个活动调用片段

识别和标记重复字符