识别同一行中的重复分组数据列R

时间:2018-03-27 16:59:16

标签: r function duplicates

首先 - 我查看了其他问题和答案,我找不到唯一能解决这个问题的问题。如果我错了,请指出我的答案。

我的数据如下:

df <- data.frame(key=c('1', '2', '3', '4', '5'),
      name1=c('black','black','black','red','red'),
      type1=c('chair','chair','sofa','sofa','plate'),
      num1=c(4,5,12,4,3),
      name2=c('black', 'red', 'black', 'green', 'blue'),
      type2=c('chair','chair','sofa','bed','plate'),
      num2=c(4,7,12,3,1),
      name3=c('blue', 'green', 'black', 'blue', 'blue'),
      type3=c('couch','chair','sofa','plate','plate'),
      num3=c(12,8,12,4,1))

key | name1 | type1 | num1 | name2 | type2 | num2 | name3 | type3 | num3
------------------------------------------------------------------------
1     black   chair    4     black   chair   4      blue    couch   12
2     black   chair    5     red     chair   7      green   chair   8
3     black   sofa     12    black   sofa    12     black   sofa    12
4     red     sofa     4     green   bed     3      purple  bowl    4
5     red     plate    3     blue    plate   1      blue    plate   1

对于一个主键,有一组数据,都在同一行上。

我需要:

  • 如果有任何
  • ,则每行识别重复的数据组
  • 计算每行重复数
  • 创建一个简单虚拟列(在行1/0中有dupes)
  • 创建任何重复值的列

因此,根据上述数据,我想在右侧添加

key | dupes | N_d_1 | name_d_1 | type_d_1 | num_d_1 | ...N_d_X
 1     1       2       black      chair      4
 2     0       0         NA         NA       NA
 3     1       3       black      sofa       12
 4     0       0         NA         NA       NA
 5     1       2       blue       plate      1

并发症 -

有近100组,每组9列,并且会有多组重复。我需要看到这些值,所有这些值以及欺骗总和需要考虑这些不同的重复组。

我可以使用庞大的IF name_d_1 == name_d_X&amp;类型等,但我认为有一个更短的更快的方法来做到这一点,我不知道。输出可能应该是一个单独的数据框,它包含每个键,但只能为重复项提取和生成变量... R已经有太多列可以有效地处理。

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

以下是使用dplyr

的开始
library(dplyr)

group_len <- 3
groups <- split(2:ncol(df), cut(2:ncol(df), 3))

stacked.df <- do.call(rbind, lapply(groups, function(cols) {
    group <- df[ , c(1, cols)]  
    names(group) <- c("key", "name", "type", "num")
    group
}))

group_by(stacked.df, key, name, type, num) %>% 
    summarise(dupes = n() > 1, num_dupes = n())

这会以长篇形式提供您想要的数据:

    # A tibble: 11 x 6
# Groups:   key, name, type [?]
   key   name  type    num dupes num_dupes
   <fct> <fct> <fct> <dbl> <lgl>     <int>
 1 1     black chair  4.00 T             2
 2 1     blue  couch 12.0  F             1
 3 2     black chair  5.00 F             1
 4 2     red   chair  7.00 F             1
 5 2     green chair  8.00 F             1
 6 3     black sofa  12.0  T             3
 7 4     red   sofa   4.00 F             1
 8 4     blue  plate  4.00 F             1
 9 4     green bed    3.00 F             1
10 5     red   plate  3.00 F             1
11 5     blue  plate  1.00 T             2

要按照您的要求将其扩展为广泛形式,我建议您查看tidyr的{​​{1}}函数或spread的{​​{1}}函数。