获取数据框中的唯一因子值

问题描述

使用starwars数据集进行可重复性(寻找tidyverse解决方案)

我可以使用来获取唯一值的数量

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

我想要的是这些数字表示的实际数据,我知道它不会是矩形数据,因为性别具有3个不同的值,性别具有5个(依此类推),但是我可以将多余的空格不适用或空白。

正在寻找最终的输出一个数据帧。

解决方法

要返回具有唯一值长度的数据框,请使用map_df

purrr::map_df(.x = starwars,.f = ~ length(unique(.x)))

要返回具有实际唯一值(用NA填充)的数据框,可以使用:

map(.x = starwars,.f = unique) %>% 
  map(`length<-`,max(lengths(.))) %>% 
  as_tibble
,

一种方法是首先计算数据集中唯一值的最大数量

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

一旦有了,我们就可以用它来索引任何一列

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

# A tibble: 87 x 8
#   name      hair_color  skin_color   eye_color sex      gender homeworld species  
#   <chr>     <chr>       <chr>        <chr>     <chr>    <chr>  <chr>     <chr>    
# 1 Luke Sky… blond       fair         blue      male     mascu… Tatooine  Human    
# 2 C-3PO     NA          gold         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 Org… brown,grey light        blue-gray NA       NA     Eriadu    Hutt     
# 6 Owen Lars black       white,red   black     NA       NA     Kashyyyk  Yoda's s…
# 7 Beru Whi… auburn,wh… unknown      orange    NA       NA     Corellia  Trandosh…
# 8 R5-D4     auburn,gr… green        hazel     NA       NA     Rodia     Mon Cala…
# 9 Biggs Da… white       green-tan,… pink      NA       NA     Nal Hutta Ewok     
#10 Obi-Wan … grey        pale         unknown   NA       NA     Bestine … Sullustan
# … with 77 more rows