Проверьте, находятся ли переменные в сопоставлении один к одному - PullRequest
0 голосов
/ 19 сентября 2018

Предположим, у меня есть фрейм данных в R с двумя переменными, которые я назову A и B.Я хочу проверить, находятся ли эти две переменные в сопоставлении один к одному).Например, рассмотрим следующий фрейм данных:

DF <- data.frame(A = c(0,2,0,1,2,1,0,1,1,1),
                 B = c('H','M','H','W','M','W','H','W','W','W'));

DF;
   A B
1  0 H
2  2 M
3  0 H
4  1 W
5  2 M
6  1 W
7  0 H
8  1 W
9  1 W
10 1 W

В этом фрейме данных мы можем проверить, что существует взаимно-однозначное соответствие между A и B0 = H1 = W и 2 = M).Я хотел бы найти способ сделать это для большего фрейма данных, используя соответствующий код R, который не требует от меня проверки каждого элемента.Код должен выдавать простое и ясное утверждение о том, существует ли взаимно-однозначное отношение между указанными переменными;простой вывод TRUE / FALSE должен быть идеальным.

Обновление: Некоторые существующие ответы могут дать мне ответ, но вывод сложнее, чем он.должно быть.Код должен давать простой и понятный вывод, отвечающий на вопрос.

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018

Вот относительно простой способ использования table функции

table(DF)
#output
   B
A   H M W
  0 3 0 0
  1 0 0 5
  2 0 2 0

. Отсюда вы можете видеть, что все 0 из A соответствуют H в B и т. Д.

Чтобы обернуть это в формальной проверке, можно проверить, соответствуют ли суммы столбца max столбца:

all.equal(colSums(table(DF)), apply(table(DF), 2,  max))
#output
TRUE
0 голосов
/ 19 сентября 2018

Если мы хотим проверить, есть ли в «A», «B» дубликаты, используйте duplicated из base R

i1 <- duplicated(DF)|duplicated(DF, fromLast = TRUE)

и оберните с all, если нам нужен один TRUE/FALSE

all(i1)
#[1] TRUE

можно обернуть в функцию

f1 <- function(dat) all(duplicated(dat)|duplicated(dat, fromLast = TRUE))
f1(DF)
#[1] TRUE
0 голосов
/ 19 сентября 2018

Мы можем написать функцию с ave, которая будет проверять, что существует только одно уникальное значение A для каждой группы (B), таким образом обеспечивая сопоставление один к одному.

is_one_to_one_mapping <- function(DF) {
   all(ave(DF$A, DF$B, FUN = function(x) length(unique(x))) == 1)
}

is_one_to_one_mapping(DF)
#[1] TRUE

Теперь мы изменим один элемент для проверки

DF$A[9] <- 2
is_one_to_one_mapping(DF)
#[1] FALSE
0 голосов
/ 19 сентября 2018

С tidyverse:

DF%>%
   group_by(A,B)%>%
   mutate(result=n(),
          isDubl=ifelse(n()>1,T,F))
# A tibble: 10 x 4
# Groups:   A, B [3]
       A B     result isDubl
   <dbl> <fct>  <int> <lgl> 
 1    0. H          3 TRUE  
 2    2. M          2 TRUE  
 3    0. H          3 TRUE  
 4    1. W          5 TRUE  
 5    2. M          2 TRUE  
 6    1. W          5 TRUE  
 7    0. H          3 TRUE  
 8    1. W          5 TRUE  
 9    1. W          5 TRUE  
10    1. W          5 TRUE  

DF%>%
   group_by(A,B)%>%
   summarise(result=n(),
          isDubl=ifelse(n()>1,T,F))
# A tibble: 3 x 4
# Groups:   A [?]
      A B     result isDubl
  <dbl> <fct>  <int> <lgl> 
1    0. H          3 TRUE  
2    1. W          5 TRUE  
3    2. M          2 TRUE 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...