Как поменять местами столбцы со строками в R

#r #tidyverse

#r #tidyverse

Вопрос:

 mtcars %>%
  select(everything()) %>%  # replace to your needs
  summarise_all(funs(sum(is.na(.))))

#>   mpg cyl disp hp drat wt qsec vs am gear carb
#> 1   0   0    0  0    0  0    0  0  0    0    0
  

У меня есть приведенный выше код, который подсчитывает значения NA в каждом столбце.
Я хочу транспонировать фрейм данных, чтобы получить такой результат:

 col_name| na_count
-------- ---------
     mpg|        0
     cyl|        0
    disp|        0
      hp|        0
     ...|      ...
    carb|        0
  

Как я могу это сделать в синтаксисе R tidyverse?

Ответ №1:

Нам просто нужно pivot_longer вкл everything() . Кроме того, этот select шаг не требуется, если мы выбираем все столбцы. В новой версии dplyr , т.е. >= 1.0.0 Вместо summarise_all , summarise_at etc, мы можем использовать summarise с across

 library(dplyr)
library(tidyr)
mtcars %>%
 summarise(across(everything(), ~ sum(is.na(.)))) %>% 
 pivot_longer(cols = everything(), names_to = 'col_name', values_to = 'na_count')
  

В base R , это может быть более компактным

 stack(colSums(is.na(mtcars)))[2:1]
  

Ответ №2:

Это также можно сделать в tidyverse с помощью gather, поскольку вы хотите перенести столбцы в строки.

 mtcars %>% 
gather(key = col_name, value= col_values) %>% 
group_by(col_name) %>% 
summarise(na_count = sum(is.na(.)))
  

Должно дать:

 # A tibble: 11 x 2
   col_name na_count
   <chr>       <int>
 1 am              0
 2 carb            0
 3 cyl             0
 4 disp            0
 5 drat            0
 6 gear            0
 7 hp              0
 8 mpg             0
 9 qsec            0
10 vs              0
11 wt              0