Как превратить столбец data.frame в столбец с наиболее быстро меняющимся значением - PullRequest
0 голосов
/ 27 мая 2020

У меня фрейм данных df1. Я хочу, чтобы столбец Cycle в df1 менялся быстрее всего. AFAIK, order делает наоборот? Нужно ли мне упорядочивать все остальные столбцы, кроме этого?

Если есть термин для операции «сортировки» этого столбца, пожалуйста, отредактируйте заголовок, я не могу придумать лучшего слова, чем «самый быстрый изменяющийся» "и, следовательно, также возникли проблемы с его поиском.

df1 <- expand.grid(
  Names = c("Model_1", "Model_2"),
  Batch_size = c(20, 32),
  Cycle = 1:5)

> df1
     Names Batch_size Cycle
1  Model_1         20     1
2  Model_2         20     1
3  Model_1         32     1
4  Model_2         32     1
5  Model_1         20     2
6  Model_2         20     2
7  Model_1         32     2
8  Model_2         32     2
9  Model_1         20     3
10 Model_2         20     3
11 Model_1         32     3
12 Model_2         32     3
13 Model_1         20     4
14 Model_2         20     4
15 Model_1         32     4
16 Model_2         32     4
17 Model_1         20     5
18 Model_2         20     5
19 Model_1         32     5
20 Model_2         32     5

РЕДАКТИРОВАТЬ: Чтобы уточнить, речь не идет о настройке такого фрейма данных. Речь идет о «сортировке» (или «несортировке», если хотите) столбца существующего фрейма данных, поэтому этот столбец становится «самым быстро меняющимся».

Ответы [ 3 ]

3 голосов
/ 27 мая 2020

Если вы хотите, чтобы самый быстро меняющийся столбец был первым столбцом, я думаю, у вас есть несколько вариантов.

Начнем с простого определения факторов:

list1 <- list(
  Names = c("Model_1", "Model_2"),
  Batch_size = c(20, 32),
  Cycle = 1:5)

(Если это из уже существующего фрейма, то можно сделать list1 <- lapply(df1, unique), чтобы получить это.)

Отсюда

rev(do.call(expand.grid, rev(list1)))
#      Names Batch_size Cycle
# 1  Model_1         20     1
# 2  Model_1         20     2
# 3  Model_1         20     3
# 4  Model_1         20     4
# 5  Model_1         20     5
# 6  Model_1         32     1
# 7  Model_1         32     2
# 8  Model_1         32     3
# 9  Model_1         32     4
# 10 Model_1         32     5
# 11 Model_2         20     1
# 12 Model_2         20     2
# 13 Model_2         20     3
# 14 Model_2         20     4
# 15 Model_2         20     5
# 16 Model_2         32     1
# 17 Model_2         32     2
# 18 Model_2         32     3
# 19 Model_2         32     4
# 20 Model_2         32     5

Это включает в себя «сортировку», но по столбцам сами, а не ряды. То есть, rev(list1) работает только с тремя элементами, а rev(expand.grid(...)) также меняет местами только три элемента (столбцы кадра).

2 голосов
/ 27 мая 2020

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

x <- split(seq_along(df1$Cycle), df1$Cycle)
df1[na.omit(c(t(sapply(x, function(y) y[seq_len(max(lengths(x)))])))),]
#     Names Batch_size Cycle
#1  Model_1         20     1
#5  Model_1         20     2
#9  Model_1         20     3
#13 Model_1         20     4
#17 Model_1         20     5
#2  Model_2         20     1
#6  Model_2         20     2
#10 Model_2         20     3
#14 Model_2         20     4
#18 Model_2         20     5
#3  Model_1         32     1
#7  Model_1         32     2
#11 Model_1         32     3
#15 Model_1         32     4
#19 Model_1         32     5
#4  Model_2         32     1
#8  Model_2         32     2
#12 Model_2         32     3
#16 Model_2         32     4
#20 Model_2         32     5
1 голос
/ 27 мая 2020

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

library(dplyr)
df1 %>% arrange_all()

или все, кроме 'Cycle' столбца.

df1 %>% arrange_at(setdiff(names(df1), 'Cycle'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...