2016-08-10 32 views
0

当我尝试使用"["对列进行部分重新排序时,值将被交换,但列名不会移动。看到下面的例子:数据帧列的部分重新排序不会移动列的名称

x = data.frame(x1 = c(1,2,3), x2 = c(2,3,4), x3 = c("e","e","e"), x4 = c("f","f","f")) 

x 
#x1 x2 x3 x4 
#1 2 e f 
#2 3 e f 
#3 4 e f 

x[, c(3,4)] = x[, c(4,3)] 
#x1 x2 x3 x4 
#1 2 f e 
#2 3 f e 
#3 4 f e 

任何想法,为什么列的名称不移动,以及如何解决这个问题?

+2

切换名称可能是比较合理的。 'name(x)[c(3,4)] < - names(x)[c(4,3)]' – Psidom

+0

@DavidArenburg我不认为这是链接的骗局 – akrun

+1

@DavidArenburg这不是完全相同。所有与换柱相关的问题都不相同。 –

回答

0

一种选择是cbind

x1 <- cbind(x[1:2], x[4:3]) 
x1 
# x1 x2 x4 x3 
#1 1 2 f e 
#2 2 3 f e 
#3 3 4 f e 

或者我们也可以用数字排序


通过做任务,我们只改变值,而不是列名。列值根据位置而改变,但不会通过交换列名来进行转换,因为列名对于该位置是固定的。

+0

这很聪明,谢谢。然而,在我将其标记为回答之前,请您详细说明为什么我写的只是在'x [,c(4,3)]'明确包含列名时才改变值。 –

+0

@YohanObadia该分配仅通过交换来更改列的值。如果我们需要更改名称,则必须单独完成,因为列名称是该列的标识。 – akrun

0

试试这个

x <- x[,c(1,2,4,3)] 
+0

这有效,但它不是我想要的。我很好奇为什么它不能像我这样做。 @akrun回答更彻底地解决它。 –