Преобразование кадра данных ближайших соседей в одногорячее кодирование

Допустим, мы взяли данные mtcars и запустили PCA. Затем мы хотим узнать, какие марки автомобилей наиболее похожи в пространстве ПК, то есть ближайших соседей. Итак, кто-то провел анализ ближайших соседей и записал его.

Затем мне предоставляется фрейм данных, который выглядит следующим образом: фокусные автомобили указаны в столбце car, а первые и вторые ближайшие соседи n1 и n2 перечислены в своих столбцах.

tibble(car = c("Honda", "Toyota", "Mazda", "Fiat", "Lotus"),
       nn1 = c("Toyota", "Honda", "Toyota", "Lotus", "Mazda"),
       nn2 = c("Mazda", "Mazda", "Honda", "Honda", "Fiat"))
# A tibble: 5 × 3
  car    nn1    nn2  
  <chr>  <chr>  <chr>
1 Honda  Toyota Mazda
2 Toyota Honda  Mazda
3 Mazda  Toyota Honda
4 Fiat   Lotus  Honda
5 Lotus  Mazda  Fiat 

Я хотел бы преобразовать это в фрейм данных одноразового стиля, где 5 основных марок автомобилей являются строками, а столбцы - возможными соседями, каждый из которых закодирован 0 или 1 в зависимости от того, был ли он одним из ближайших соседей. к фокусному автомобилю. В виде тиббла это будет выглядеть так:

# A tibble: 5 × 6
  cars   Honda Toyota Mazda  Fiat Lotus
  <chr>  <dbl>  <dbl> <dbl> <dbl> <dbl>
1 Honda      0      1     1     0     0
2 Toyota     1      0     1     0     0
3 Mazda      1      1     0     0     0
4 Fiat       1      0     0     0     1
5 Lotus      0      0     1     1     0

или это может быть такой фрейм данных:

       Honda Toyota Mazda Fiat Lotus
Honda      0      1     1    0     0
Toyota     1      0     1    0     0
Mazda      1      1     0    0     0
Fiat       1      0     0    0     1
Lotus      0      0     1    1     0
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
87
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Больше похоже на матрицу смежности, чем на матрицу горячего кодирования. Звоню на ваши данные df:

library(tidyr)
library(dplyr)
df |>
  pivot_longer(-car) |>
  mutate(fill = 1) |>
  pivot_wider(id_cols = car, names_from = value, values_from = fill, values_fill = 0)
# # A tibble: 5 × 6
#   car    Toyota Mazda Honda Lotus  Fiat
#   <chr>   <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 Honda       1     1     0     0     0
# 2 Toyota      0     1     1     0     0
# 3 Mazda       1     0     1     0     0
# 4 Fiat        0     0     1     1     0
# 5 Lotus       0     1     0     0     1

матрица смежности для меня новая, спасибо за четкий ответ!

jnat 08.07.2024 23:05

Может быть, вы можете попробовать table, как показано ниже

> with(df, table(rep(car, each = ncol(df) - 1), t(df[-1])))

         Fiat Honda Lotus Mazda Toyota
  Fiat      0     1     1     0      0
  Honda     0     0     0     1      1
  Lotus     1     0     0     1      0
  Mazda     0     1     0     0      1
  Toyota    0     1     0     1      0

или

> with(df, table(data.frame(x = car, y = c(nn1, nn2))))
        y
x        Fiat Honda Lotus Mazda Toyota
  Fiat      0     1     1     0      0
  Honda     0     0     0     1      1
  Lotus     1     0     0     1      0
  Mazda     0     1     0     0      1
  Toyota    0     1     0     1      0

или как @thelatemail предложил в комментарии

> table(cbind(df[1], unlist(df[-1])))
        unlist(df[-1])
car      Fiat Honda Lotus Mazda Toyota
  Fiat      0     1     1     0      0
  Honda     0     0     0     1      1
  Lotus     1     0     0     1      0
  Mazda     0     1     0     0      1
  Toyota    0     1     0     1      0

Вариация на тему table(cbind(df[1], unlist(df[-1]))) или table(cbind(df[1], neighbour=unlist(df[-1]))), если хотите красивые названия.

thelatemail 08.07.2024 23:33

@thelatemail, если вы опубликуете это, я знаю, что поддержу.

M-- Save the Data Dump 08.07.2024 23:43

@thelatemail да, спасибо за ваш вклад, он кажется более кратким :)

ThomasIsCoding 08.07.2024 23:45
as.data.frame.matrix(table(reshape2::melt(df, id = 1)[-2]))

#>        Fiat Honda Lotus Mazda Toyota
#> Fiat      0     1     1     0      0
#> Honda     0     0     0     1      1
#> Lotus     1     0     0     1      0
#> Mazda     0     1     0     0      1
#> Toyota    0     1     0     1      0

Из пакета fastDummies функция dummy_cols() создаст эти столбцы, если вы сначала объедините их:

library(fastDummies)
library(tidyr)

df |>
  unite("dummy", starts_with("nn"), remove = F) |>
  dummy_cols("dummy", split = "_", omit_colname_prefix = T, remove_selected_columns = T)

Выход

  car    nn1    nn2   Honda Mazda Lotus  Fiat Toyota
  <chr>  <chr>  <chr> <int> <int> <int> <int>  <int>
1 Honda  Toyota Mazda     0     1     0     0      1
2 Toyota Honda  Mazda     1     1     0     0      0
3 Mazda  Toyota Honda     1     0     0     0      1
4 Fiat   Lotus  Honda     1     0     1     0      0
5 Lotus  Mazda  Fiat      0     1     0     1      0

Другие вопросы по теме