2016-09-22 72 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")] 

我覺得它更合適。