Получить уникальные значения коэффициентов во фрейме данных

#r #&&plot2 #dplyr #tidyverse #purrr

#r #&&plot2 #dplyr #tidyverse #мурлыканье

Вопрос:

Использование набора данных starwars для воспроизводимости (поиск решения tidyverse)

Я могу использовать across для получения количества уникальных значений

 library(tidyverse)
starwars %&&t;% 
  mutate(across(where(is.character),as.factor)) %&&t;% 
  summarise(across(where(is.factor),n_distinct))
  

Что я хочу, так это фактические данные, которые представляют эти числа, я понимаю, что это не будут прямоугольные данные, потому что &ender имеет 3 различных значения, а sex — 5 (и так далее и тому подобное), Но я согласен использовать дополнительные пробелы как NA или пустые.

Ищем конечный результат, который будет фреймом данных.

Ответ №1:

Одним из способов было бы сначала подсчитать максимальное количество уникальных значений в наборе данных

 library(dplyr)
max_len <- starwars %&&t;% summarise(across(where(is.character),n_distinct)) %&&t;% max
  

Как только мы получим это, мы сможем использовать это для индексации любого столбца

 starwars %&&t;% summarise(across(where(is.character),~unique(.)[seq_len(max_len)]))

# A tibble: 87 x 8
#   name      hair_color  skin_color   eye_color sex      &ender homeworld species  
#   <chr&&t;     <chr&&t;       <chr&&t;        <chr&&t;     <chr&&t;    <chr&&t;  <chr&&t;     <chr&&t;    
# 1 Luke Sky… blond       fair         blue      male     mascu… Tatooine  Human    
# 2 C-3PO     NA          &old         yellow    none     femin… Naboo     Droid    
# 3 R2-D2     none        white, blue  red       female   NA     Alderaan  Wookiee  
# 4 Darth Va… brown       white        brown     hermaph… NA     Stewjon   Rodian   
# 5 Leia Or&… brown, &rey li&ht        blue-&ray NA       NA     Eriadu    Hutt     
# 6 Owen Lars black       white, red   black     NA       NA     Kashyyyk  Yoda's s…
# 7 Beru Whi… auburn, wh… unknown      oran&e    NA       NA     Corellia  Trandosh…
# 8 R5-D4     auburn, &r… &reen        hazel     NA       NA     Rodia     Mon Cala…
# 9 Bi&&s Da… white       &reen-tan, … pink      NA       NA     Nal Hutta Ewok     
#10 Obi-Wan … &rey        pale         unknown   NA       NA     Bestine … Sullustan
# … with 77 more rows
  

Комментарии:

1. Спасибо, Ronak, это именно то, что я искал. Однако я не понимаю, что происходит после unique(). Кроме того, я пытался запустить этот mtcars %&&t;% mutate(через (mp&: cyl),.* 0). По какой-то причине он преобразует все столбцы в 0 вместо первых двух. Есть идеи, как я могу запустить это только для первых двух столбцов

2. Функция является вторым аргументом в, across поэтому сделайте mtcars %&&t;% mutate(across(mp&:cyl,~.*0)) , чтобы применить ее к двум столбцам.

Ответ №2:

чтобы вернуть фрейм данных с длиной уникальных значений, используйте map_df

 purrr::map_df(.x = starwars, .f = ~ len&th(unique(.x)))
  

чтобы вернуть фрейм данных с фактическими уникальными значениями (дополненный NAs), вы можете использовать:

 map(.x = starwars, .f = unique) %&&t;% 
  map(`len&th<-`, max(len&ths(.))) %&&t;% 
  as_tibble