2012-12-30 286 views
2

在data.frame中,<-可以得到很奇怪的輸出,原因是什麼?< - 和=在data.frame中有什麼區別?

x<-data.frame(name<-c("n1","n2"),age<-c(5,6)) 
y<-data.frame(name=c("n1","n2"),age=c(5,6)) 
> x 
name....c..n1....n2.. age....c.5..6. 
1     n1    5 
2     n2    6 
> y 
    name age 
1 n1 5 
2 n2 6 

< - and = in data.frame這裏有什麼區別?

+0

也可以看看http://stackoverflow.com/questions/11676179/different-behavior-in-using-versus-operator-while- assign-a-dataframe and http://stackoverflow.com/questions/1741820/assignment-operators-in-r-and –

回答

8

不,這並不奇怪。您調用的數據框架的構造函數名爲未命名的對象。

本來我認爲data.frame是一個列表,並使用幫助(列表)來解釋data.frame的行爲。即使是哲學是相同的(命名和未命名的論點),這是一個錯誤,答案是在data.frame

from?data.frame我拿這部分我們談論的論點名稱

如果參數是所有命名的簡單對象(不是列表, 數據框的矩陣),那麼參數名稱會給出 列的名稱。對於未命名的簡單參數,將使用 參數的解析版本作爲名稱(刪除了封閉的I(...))。

所以

x<-data.frame(name<-c("n1","n2"),age<-c(5,6)) 

這相當於:

x <- data.frame(c("n1","n2"),c(5,6)) ## unnamed objects The functions return dotted pair list 
name<-c("n1","n2") 
age<-c(5,6) 

然後y的

y<-data.frame(name=c("n1","n2"),age=c(5,6)) ## named objects functions return a list 

但是請注意,這隻能解釋爲簡單對象參數的命名方法。命名比添加點更復雜。 例如,我發現非常驚人的,論文2條語句是等價的(與check.names = T或F):

  a <- data.frame(y <- list(x=1)) 
     a <- data.frame(y = list(x=1)) 
+1

我不認爲'help(list)'中的信息解釋了這一點。看看list(x <-1:4)的結果吧 –

+0

@DWin你是對的!謝謝我糾正了我的答案,希望這個解釋更好的問題。 – agstudy

+0

在最後一位中,表達式'y < - list(x = 1)'_does_的值有一個值,並且該對象_does_的值有一個名稱。 –

7

是的,我想你做的。表達式age<-c(5,6)確實給出了結果(來自<-的值),但由於您未能在參數列表中使用適當的賦值運算符用於形式,所以完整表達式被傳遞給check.names作爲列的名稱。它將所有無效字符轉換爲點。您可以防止check.names被調用(不,你一般會wnat做到這一點。

> x<-data.frame(name<-c("n1","n2"),age<-c(5,6), check.names=FALSE) 
> x 
    name <- c("n1", "n2") age <- c(5, 6) 
1     n1    5 
2     n2    6 
0

R,像許多語言,由內而外的。作品所以在你的例子爲X,「名」被賦予'n1'和'n2'的值以及5和6的'年齡'值,但是當data.frame被創建時,那些列的名字被R解釋爲你給出的特殊字符串字符變成點...最好堅持你的例子的語法

+0

不幸的是,R並不總是「內而外」的。參見[非標準評估](http://adv-r.had.co.nz/Computing-on-the-language.html) –

相關問題