2014-02-28 97 views
4

我正在嘗試在不創建對象(數據幀)的情況下重命名列。R找不到函數

當我運行:

names(data.frame(cbind(LETTERS[1:3],1:3)))[1]<-"A" 

我得到:

Error in names(data.frame(cbind(LETTERS[1:3], 1:3)))[1] <- "A" : could not find function "data.frame<-" 

如果我運行:

X<-data.frame(cbind(LETTERS[1:3],1:3)) 
colnames(X)[1]<-"letters" 
X 

我會看到列名稱改變了,因爲我做了一個數據幀然後改變它。我很確定這兩個代碼片段除了創建對象之外都是一樣的。我不知道R在這個功能上是否剛性不夠,我不得不創建對象而不是其他的。但是錯誤「......找不到功能」對我來說似乎有點奇怪。有人可以解釋這個錯誤嗎?

回答

15

正如其他人所說,你需要首先命名數據幀。 (雖然有辦法避免這種情況,請繼續關注。)但是你已經知道了,並且想知道爲什麼。這裏是。

這樣的功能是替代功能。它們是一種「語法糖」,可以使某種操作變得更簡單。詳情請參閱此答案: https://stackoverflow.com/a/11563358/210673

這裏是一個替換功能以及它真的等於一個例子。

names(d) <- c("A","B") 
d <- `names<-`(d, c("A","B")) 

因此你的電話確實是(從cbind取結果出來爲簡單起見)

tmp <- cbind(LETTERS[1:3],1:3) 
data.frame(tmp) <- `names<-`(data.frame(tmp), c("A","B")) 

這又試圖調用

tmp <- `data.frame<-`(tmp, `names<-`(data.frame(tmp), c("A","B"))) 

而且因爲沒有失敗data.frame<-功能。

你可以通過不使用語法糖版本names<-來完成你想要的,而是直接使用它,因爲這不會嘗試做任務。

`names<-`(data.frame(tmp), c("A","B")) 
+0

+1,細節很好的解釋。 – BrodieG

+0

+1。另見:http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this –

5

你有什麼期待您的第一個命令的返回值是什麼?考慮:

> (colnames(X)[1]<-"letters") 
[1] "letters" 

所以,即使在那裏爲了看到數據幀輸出,你必須運行另一個命令。也許setNames讓你的方式延伸到,你想:

> setNames(data.frame(cbind(LETTERS[1:3],1:3)), c("letters")) 
    letters NA 
1  A 1 
2  B 2 
3  C 3 

或者更好的是:

> data.frame(letters=LETTERS[1:3], 1:3) 
    letters V2 
1  A 1 
2  B 2 
3  C 3