2016-09-22 42 views
7

为什么不能正常工作?为什么'[<-`无法重新排序数据帧列?

df <- data.frame(x=1:2, y = 3:4, z = 5:6) 
df[] <- df[c("z", "y", "x")] 
df 
#> x y z 
#> 1 5 3 1 
#> 2 6 4 2 

请注意,名称是按原始顺序排列的,但数据本身已更改顺序。

这只是正常

df <- data.frame(x=1:2, y = 3:4, z = 5:6) 
df[c("z", "y", "x")] 
#> z y x 
#> 1 5 3 1 
#> 2 6 4 2 
+1

它确实工作。您要求R替换名称不是名称 –

+0

您可以使用''debugonce('[< - 。data.frame'); df [] < - df [c(“z”,“y”,“x”)) ]''看看发生了什么。然后,您可以在调试器中遍历代码。 – cryo111

回答

6

当解压完成更换不名称索引值。例如,更换下面的第一项不影响该元素的名称:

x <- c(a=1, b=2) 
x[1] <- 3 
x 
a b 
3 2 

在数据帧你以同样的方式取代了值。值改变了,但名字保持不变。要重新排序数据帧,请避免提取框架。

df <- df[c("z", "y", "x")] 
+0

同样,为了更直接地确认只有值被替换,请尝试'df < - data.frame(a = 2,b = 3); dd < - data.frame(AA = 4,BB = 5); df [] < - dd; df'。 –

0

只是不要把[]中的DF后,它会做你想要的......

df <- data.frame(x=1:2, y = 3:4, z = 5:6) 
df <- df[c("z", "y", "x")] 
df 
# z y x 
#1 5 3 1 
#2 6 4 2 

如果你的问题是为什么,皮埃尔Lafortune的评论是正确的。

作为一个侧面说明,我也喜欢到commat添加到单独的维度:

df <- df[,c("z", "y", "x")] 

我觉得它更合适。