如何将data.frame列转换为值变化最快的列

时间:2020-05-27 07:25:56

标签: r dataframe sorting

我有一个数据帧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 个答案:

答案 0 :(得分:3)

如果您希望将变化最快的列为第一栏,那么我认为您有两种选择。

从简单定义因素开始:

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(...))也仅可反转三个元素(一帧的列)。

答案 1 :(得分:2)

如果您不想对所有其他列进行排序,或者如果您仅对一列进行排序,则可以为每个组创建一个保存行号的矩阵,并在各组中使用它们以使其在行与行之间进行更改

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

答案 2 :(得分:1)

由于数据已经存在于df1中,因此我们可以使用

排列所有列
library(dplyr)
df1 %>% arrange_all()

或除'Cycle'列以外的所有内容。

df1 %>% arrange_at(setdiff(names(df1), 'Cycle'))
相关问题