在矩阵/数据框中改变行的顺序

26

我需要更改/倒置我的数据帧的行,而不是转置数据,即将底部行移动到顶部,以此类推。如果数据框如下:

1 2 3 
4 5 6
7 8 9

我需要转换为

7 8 9
4 5 6
1 2 3

我已经阅读了 sort() 的相关信息,但我认为它不是我所需要的,或者我找不到方法。

7个回答

40

可能还有更优雅的方法,但这个方法是可行的:

m <- matrix(1:9, ncol=3, byrow=TRUE)

# m[rev(seq_len(nrow(m))), ]  # Initial answer
m[nrow(m):1, ]
     [,1] [,2] [,3]
[1,]    7    8    9
[2,]    4    5    6
[3,]    1    2    3

这个方法有效是因为你在将矩阵索引时使用了一个反转的整数序列作为行索引。nrow(m):1会得到3 2 1



28

使用 dplyr 包可以反转数据框的顺序:

iris %>% arrange(-row_number())

或者通过以下方式使用不使用管道操作符

arrange(iris, -row_number())

1
或者 iris[order(row.names(iris), decreasing = T),] - Veerendra Gadekar
1
@VeerendraGadekar 我认为你的解决方案不够直观,因为它有一个“孤立”的逗号,两次指定了感兴趣的表,并混合使用圆括号和方括号。我知道这是正确的基本语法,但在我的口味中缺少一些优雅。 - Holger Brandl
4
@VeerendraGadekar,实际上这样做不会正确运行,因为row.number是实际上是字符。你需要先将其转换为整数,例如:iris[order(as.integer(row.names(iris)), decreasing = TRUE),] - David Arenburg
1
或者 iris %>% arrange(desc(row_number())) - James Hirschorn

8
我会将行反转并从行数开始逆序排列。
revdata <-  thedata[dim(thedata)[1L]:1,]

6
我认为这是最简单的方法:
MyMatrix = matrix(1:20, ncol = 2)
MyMatrix[ nrow(MyMatrix):1, ]

如果您想反转列,只需执行以下操作:
MyMatrix[ , ncol(MyMatrix):1 ]

4
我们可以反转行名称的顺序(仅适用于数据框):
# create data.frame
m <- matrix(1:9, ncol=3, byrow=TRUE)
df_m <- data.frame(m)

#reverse
df_m[rev(rownames(df_m)), ]

#   X1 X2 X3
# 3  7  8  9
# 2  4  5  6
# 1  1  2  3

2
非常晚,但这似乎运行速度很快,不需要任何额外的软件包,而且简单:
for(i in 1:ncol(matrix)) {matrix[,i] = rev(matrix[,i])}

我猜对于频繁使用的情况,人们会将其制作成一个函数。在R v=3.3.1版本中测试通过。


通常建议使用dplyr :: arrange或某种形式的seq进行向量化解决方案,因为R针对向量操作进行了优化,而不是循环。被接受的答案也不依赖于任何额外的软件包。 - John D

1
今天遇到了这个问题,我在这里提供另一种解决方案,希望对你有所帮助。
m <- matrix(1:9, ncol=3, byrow=TRUE)    
apply(m,2,rev)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接