Равные пары строк в кадре данных в R - PullRequest
0 голосов
/ 16 января 2020

Я хотел бы построить matrix, где каждая ячейка сообщает, равна или нет каждая пара строк из data.frame.

Например, с этим data.frame:

set.seed(1)
ex <- data.frame(id = paste0("id", c(1:5)),
                 group = sample(c("a", "b", "c"), 5, replace = TRUE))
> ex
   id group
1 id1     a
2 id2     c
3 id3     a
4 id4     b
5 id5     a

Я хотел бы получить следующую матрицу:

      id1   id2   id3   id4   id5
id1  TRUE FALSE  TRUE FALSE  TRUE
id2 FALSE  TRUE FALSE FALSE FALSE
id3  TRUE FALSE  TRUE FALSE  TRUE
id4 FALSE FALSE FALSE  TRUE FALSE
id5  TRUE FALSE  TRUE FALSE  TRUE

Ответы [ 2 ]

2 голосов
/ 16 января 2020

А вот и dplyr решение

# load the tidyverse package
library(tidyverse)

# this is your dataframe
set.seed(1)
ex <- data.frame(id = paste0("id", c(1:5)),
                 group = sample(c("a", "b", "c"), 5, replace = TRUE))

# now we create another dataframe that contains all ID combinations
df <- expand.grid(laterColumn = ex$id
            , laterRow = ex$id)

# now we take this dataframe
df %>% # then
    left_join(ex, by = c("laterColumn" = "id")) %>% # left join the groups on one ID
    left_join(ex, by = c("laterRow" = "id")) %>% # and then left join again on the other ID
    mutate(sameGroup = group.x == group.y) %>% # now we compare whether the groups are the same
    select(-group.x, -group.y) %>% # and remove the unnecessary group columns
    spread(key = laterColumn, value = sameGroup) # and finally bring it from a long into a wide format
1 голос
/ 16 января 2020

Мы можем использовать outer для сравнения каждого значения ex$group с самим собой.

outer(ex$group, ex$group, `==`)

#      [,1]  [,2]  [,3]  [,4]  [,5]
#[1,]  TRUE FALSE  TRUE FALSE  TRUE
#[2,] FALSE  TRUE FALSE FALSE FALSE
#[3,]  TRUE FALSE  TRUE FALSE  TRUE
#[4,] FALSE FALSE FALSE  TRUE FALSE
#[5,]  TRUE FALSE  TRUE FALSE  TRUE

Если нам нужно добавить имена строк и столбцов, мы можем сделать

matrix(outer(ex$group, ex$group, `==`), nrow = nrow(ex), 
       dimnames = list(ex$id, ex$id))

#      id1   id2   id3   id4   id5
#id1  TRUE FALSE  TRUE FALSE  TRUE
#id2 FALSE  TRUE FALSE FALSE FALSE
#id3  TRUE FALSE  TRUE FALSE  TRUE
#id4 FALSE FALSE FALSE  TRUE FALSE
#id5  TRUE FALSE  TRUE FALSE  TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...