У меня есть датафрейм ниже:
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
. Чего я хочу добиться, так это создать новый фрейм данных, который будет включать в себя дублированные пары строк между A
и B
, индекс строк, в которых происходит такое дублирование, имена столбцов, которые делают эти строки различными (C,D
, или C
и D
) в третьем столбце и положение столбца тех имен столбцов, которые отличают эти строки.
Желаемый вывод должен выглядеть примерно так:
# 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
Как видите, дублированные пары строк различаются по столбцам C и D, которые находятся в 3-й и 4-й позиции основного набора данных соответственно. Как вы можете видеть ниже, единственное, что нужно добавить - это положение столбца на основе начального набора данных master
.
#code
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