Dplyr / tidyverse Как упорядочить столбцы сначала по количеству доступных значений, а затем по алфавиту? - PullRequest
1 голос
/ 07 января 2020

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

tonnage <- c(NA, NA, 280, 890)
tonnage2 <- c(NA, NA, 567, 899)
year1 <- c(1990, 2018, 1889, 2000)
id <- c(1, 2, 3, 4)
tonnage3 <- c(NA, 456, 567, 899)

dataset <- data.frame(tonnage, tonnage2, year1, id, tonnage3)

Что я могу сделать:

 # order column alpha
dataset %>%
  select(sort(names(.)))

 # Count number of available values and sort
 sort(colSums(!is.na(dataset)))

Что я хочу: id, год1, тоннаж3, тоннаж, тоннаж2.

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Вы можете использовать colSums для подсчета числа NA в каждом столбце, sort значений, извлечь имена и использовать их для подмножества кадра данных.

dataset[names(sort(colSums(is.na(dataset))))]

#  year1 id tonnage3 tonnage tonnage2
#1  1990  1       NA      NA       NA
#2  2018  2      456      NA       NA
#3  1889  3      567     280      567
#4  2000  4      899     890      899

Чтобы использовать его в каналах, вы можете использовать то же самое в select.

library(dplyr)
dataset %>% select(names(sort(colSums(is.na(.)))))

Только что понял, что выше не сортируется по алфавиту в случае равных NA. Мы можем сделать

cols <- sort(colSums(is.na(dataset)))
dataset[unlist(tapply(names(cols), cols, sort))]

#  id year1 tonnage3 tonnage tonnage2
#1  1  1990       NA      NA       NA
#2  2  2018      456      NA       NA
#3  3  1889      567     280      567
#4  4  2000      899     890      899
1 голос
/ 07 января 2020

Вы должны убедиться, что ваши столбцы сначала упорядочены в алфавитном порядке, а затем использовать colSums на ваших NA и отсортировать по этому номеру,

т.е.

dataset <- dataset[order(gsub('\\D+', '', names(dataset)))]

#then sort on number of NAs,
dataset[names(sort(colSums(is.na(dataset))))]

, что дает,

   id year1 tonnage3 tonnage tonnage2
1  1  1990       NA      NA       NA
2  2  2018      456      NA       NA
3  3  1889      567     280      567
4  4  2000      899     890      899
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...