Вставить пустую строку между группами и сохранить первоначальный порядок - PullRequest
0 голосов
/ 22 января 2019

Я в основном делаю то, что описано в этом вопросе , однако я пытаюсь сохранить исходный порядок столбца month.Окружным способом было бы добавить начальный ноль к однозначным числам.Я пытаюсь найти способ, не делая этого.

Текущий код:

library(dplyr)
df <- structure(list(parameters = c("temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp", "temp"), month = c("2", "2", "2", "5", "5", "5", "8", "8", "8", "11", "11", "11", "annual", "annual", "annual")), class = "data.frame", row.names = c(NA, -15L))
do.call(bind_rows, by(df, df[ ,c("month", "parameters")], rbind, ""))

Функция by выглядит так, как будто она приводит ваши определенные индексы к факторам и конвертирует monthфактор показывает, что он делает уровни в следующем порядке: 11, 2, 5, 8, annual.Если бы он был числовым, он бы упорядочил их правильно, но с включенным annual этот столбец должен быть как символ.

Если я сначала преобразовал его в коэффициент и упорядочил уровни, мой код вставитNA с.

df$month <- ordered(df$month, levels = c("2", "5", "8", "11", "annual"))
do.call(bind_rows, by(df, df[ ,c("month", "parameters")], rbind, ""))

Токовый выход:

   parameters  month
1        temp     11
2        temp     11
3        temp     11
4                   
5        temp      2
6        temp      2
7        temp      2
8                   
9        temp      5
10       temp      5
11       temp      5
12                  
13       temp      8
14       temp      8
15       temp      8
16                  
17       temp annual
18       temp annual
19       temp annual
20                  

Желаемый выход:

   parameters month
1        temp     2
2        temp     2
3        temp     2
4                  
5        temp     5
6        temp     5
7        temp     5
8                  
9        temp     8
10       temp     8
11       temp     8
12                 
13       temp    11
14       temp    11
15       temp    11
16                 
17       temp annual
18       temp annual
19       temp annual
20                  

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Существует альтернативный подход, который использует воплощение функции rbind() для добавления пустой строки после каждой группы:

library(data.table)
setDT(df)[, rbind(.SD, data.table(parameters = "")), by = month]
     month parameters
 1:      2       temp
 2:      2       temp
 3:      2       temp
 4:      2           
 5:      5       temp
 6:      5       temp
 7:      5       temp
 8:      5           
 9:      8       temp
10:      8       temp
11:      8       temp
12:      8           
13:     11       temp
14:     11       temp
15:     11       temp
16:     11           
17: annual       temp
18: annual       temp
19: annual       temp
20: annual

Порядок групп сохраняется. Переменная группировки month отображается перед каждой строкой. Этот подход также можно использовать для разброса произвольного числа пустых строк, если требуется:

n_blank <- 2L
setDT(df)[, rbind(.SD, data.table(parameters = rep("", n_blank))), by = month]
     month parameters
 1:      2       temp
 2:      2       temp
 3:      2       temp
 4:      2           
 5:      2           
 6:      5       temp
 7:      5       temp
 8:      5       temp
 9:      5           
10:      5           
11:      8       temp
12:      8       temp
13:      8       temp
14:      8           
15:      8           
16:     11       temp
17:     11       temp
18:     11       temp
19:     11           
20:     11           
21: annual       temp
22: annual       temp
23: annual       temp
24: annual           
25: annual           
     month parameters
0 голосов
/ 22 января 2019

Проблема заключается в том, что после того, как столбец 'месяц' был изменен на коэффициент ordered, "" не указывается как один из levels.Поэтому, естественно, любое значение, которое не является level, рассматривается как пропущенное значение, и, следовательно, мы получаем NA.Исправление можно выполнить на более раннем этапе, включив "" в качестве одного из levels

df$month <- ordered(df$month, levels = c("2", "5", "8", "11", "annual", ""))

ПРИМЕЧАНИЕ. order из "" неясно.Итак, он указан как последний level

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...