Я выщипываю глаза, чтобы понять это в пятницу вечером. Мои данные выглядят так

df <- data.frame(teamA=c("Italy","Italy","England","England"),
                 teamB=c("Germany","Greece","Germany","Greece"), win=c(0,1,1,1))
df
    teamA   teamB win
1   Italy Germany   0
2   Italy  Greece   1
3 England Germany   1
4 England  Greece   1

И я хочу преобразовать его в матрицу, которая выглядит так. Желательно с dplyr, но я в таком отчаянии, что не имеет значения

         Italy   England 
Germany  0         1

Greece   1         1

1
LDT 10 Июл 2021 в 00:51

3 ответа

Лучший ответ

Попробуйте использовать xtabs из base R и установите для атрибутов значение NULL (пакеты не требуются)

out <- xtabs(win ~ teamB + teamA, df)
names(dimnames(out)) <- NULL
2
akrun 10 Июл 2021 в 19:02

Вариант с igraph

graph_from_data_frame(df) %>%
    set_vertex_attr(name = "type", value = names(V(.)) %in% df$teamA) %>%
    as_incidence_matrix(attr = "win")

Дает

        Italy England
Germany     0       1
Greece      1       1
2
ThomasIsCoding 9 Июл 2021 в 22:46

Использование pivot_wider -

library(tidyverse)

df %>%
  pivot_wider(names_from = teamA, values_from = win) %>%
  column_to_rownames('teamB') %>%
  as.matrix

#.       Italy England
#Germany     0       1
#Greece      1       1
2
Ronak Shah 10 Июл 2021 в 03:01