我有一个数据帧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
编辑:只是为了澄清,这与设置这样的数据框无关。这是关于对现有数据框的一列进行“排序”(或根据需要进行“未排序”),因此该列将成为“变化最快的”一列。
答案 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'))