Извлечение позиций столбцов, которые отличаются строк с дублированными парами в кадре данных - PullRequest
0 голосов
/ 04 января 2019

У меня есть датафрейм ниже:

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 

1 Ответ

0 голосов
/ 04 января 2019

Вы можете использовать data.table, который имеет удобные символы .N для размера группы и .I для номера строки. Осталось только проверить, какие столбцы отличаются, что вы можете сделать, sapply над ними и проверяя количество уникальных элементов с помощью uniqueN.

library(data.table)
library(magrittr)
setDT(master)

out <- 
  master[, .(n = .N, 
             locs = .(.I), 
             different = .(names(.SD)[sapply(.SD, uniqueN) != 1]))
         , by = .(A, B)] %>% 
    .[n > 1]

out
#    A B n locs different
# 1: 2 3 2  3,4       C,D
# 2: 4 6 2  7,8       C,D

Тогда вы можете получить position, используя match(different, names(master)), используя lapply, чтобы идти по одной строке за раз.

out[, position := lapply(different, match, names(master))]

out
#    A B n locs different position
# 1: 2 3 2  3,4       C,D      3,4
# 2: 4 6 2  7,8       C,D      3,4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...