Автоматизированный способ вычитания высоты указанных c символов звездных войн из других символов - PullRequest
1 голос
/ 06 мая 2020

Предположим, я хочу создать новый столбец в наборе данных звездных войн, где я максимально автоматизированным способом вычту высоту Йоды из высоты Люка Скайуокера, Энакина Скайуокера, R5D4, а высоту R2-D2 из высота Дарта Вейдера, Леи Органы, Биггса Дарклайтера и высота Гасгано с высоты Уилхаффа Таркина Чубакки, Хана Соло. Как бы я это сделал? Я новичок ie и в основном использую tidyverse. Заранее большое спасибо!

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Это работа для outer. У меня нет набора данных starwars (это в стандартном R?), Но если предположить, что он выглядит примерно как

name          height
Darth Vader   199
Yoda          72
...

, тогда

M <- outer(starwars$height,starwars$height,"-")
rownames(M) <- colnames(M) <- starwars$name

даст вам матрицу с перепады высот (диагонали будут равны 0).

1 голос
/ 06 мая 2020

Я не был уверен, пытались ли вы автоматизировать только определенные группы или были доступны все сравнения (в этом случае вы можете выполнить конвейерную обработку, чтобы получить любую потенциальную группировку). Мне нравится элегантное матричное решение @JDL, поэтому я взял его и просто добавил немного вроде очистки имен переменных с помощью janitor и некоторой группировки

library(tidyverse)
require(janitor)

M <- outer(starwars$height,
           starwars$height,
           "-")

rownames(M) <- colnames(M) <- starwars$name

new_starwars <- janitor::clean_names(as_tibble(cbind(starwars, M)))

# glimpse(new_starwars)

new_starwars %>% 
  mutate(heightminusYoda = yoda) %>%
  filter(name %in% c("Luke Skywalker", "Anakin Skywalker", "R5-D4")) %>%
  select(name, heightminusYoda)
#> # A tibble: 3 x 2
#>   name             heightminusYoda
#>   <chr>                      <int>
#> 1 Luke Skywalker               106
#> 2 R5-D4                         31
#> 3 Anakin Skywalker             122

Создано 06.05.2020 пакет REPEX (v0.3.0)

...