提取存在重复对的行索引,以及这些行的值不同

时间:2019-01-03 16:55:51

标签: r

我的数据框如下:

master <- data.frame(A=c(1,1,2,2,3,3,4,4,5,5), B=c(1,2,3,3,4,5,6,6,7,8),C=c(5,2,5,7,7,5,7,9,7,8),D=c(1,2,5,3,7,5,9,6,7,0))

如您所见,我有4列A,B,C,D。我想要实现的是创建一个新的数据框,其中将包括AB之间的重复对行,发生重复的行的索引以及使这些行不同的列名( C,D,或第三列中的CD)。为了使请求更清楚,我显示了一个示例,其中包含master2而不是master,其中仅包含AB

master2 <- data.frame(A=c(1,1,2,2,3,3,4,4,5,5), B=c(1,2,3,3,4,5,6,6,7,8))

,然后加上:

library(data.table)
setDT(master2)

master2[master2[, .N, by=names(master2)][ N > 1L ], on=names(master2), 
  .(N, locs = .(.I)), by=.EACHI]

我得到:

#    A B N locs
# 1: 2 3 2  3,4
# 2: 4 6 2  7,8

因此,我希望将此逻辑实现到master数据帧,并还要添加另一个名为“ Different”的列,其列名使这些行有所不同。如果行与所有行都相同,则具有不同列名的新列应作为值“ nothing”。如果可以添加另一列,且其初始位置为“不同”列。 C是3,D是4?

所需的输出应类似于:

# A tibble: 2 x 4
# Groups:   A [?]
#     A     B     n locs  different position
#   <dbl> <dbl> <int> <chr> <chr>    <int>
#1     2     3     2 3, 4  C, D     3,4
#2     4     6     2 7, 8  C, D     3,4

1 个答案:

答案 0 :(得分:1)

如果我们需要行索引,则创建一个按感兴趣的列分组的序列列('rn'),仅保留行数大于1的组,[a=1,b=2,c=3]即可获得行(summarise)以及该组行序列的n() ed索引。关于“不同”列,其逻辑尚不完全清楚。这里,是一种基于paste

在同一组“ A”和“ B”中出现不同值的一种实现
case_when

更新

基于包含“位置”的评论

library(tidyverse)
master %>%
   mutate(rn = row_number()) %>% 
   group_by(A, B) %>% 
   filter(n() > 1) %>% 
   summarise(n = n(), 
            locs =  toString(rn),
            Different = case_when(n_distinct(C) > 1 & n_distinct(D) > 1 ~ 'C, D', 
                                  n_distinct(C) > 1 ~ 'C', 
                                  n_distinct(D) > 1 ~ 'D', 
                                  TRUE ~ 'Same')) 
# A tibble: 2 x 4
# Groups:   A [?]
#     A     B     n locs  different
#   <dbl> <dbl> <int> <chr> <chr>    
#1     2     3     2 3, 4  C, D     
#2     4     6     2 7, 8  C, D