data.frame中< - 和=之间有什么区别?

时间:2012-12-30 07:31:59

标签: r

在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

data.frame中的&lt; - 和=之间有什么区别?

3 个答案:

答案 0 :(得分:8)

不,这不奇怪。使用名为未命名的对象调用data.frame的构造函数。

最初我认为data.frame是一个列表并使用help(list)来解释data.frame的行为。即使是哲学是相同的(命名和未命名的参数),这是一个错误,答案是在data.frame的帮助下

来自?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 

但请注意,这只解释了简单对象参数的命名过程。命名比添加一些点更复杂。 例如,我发现这两个语句是等价的(使用check.names = T或F),我觉得非常惊人:

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

答案 1 :(得分:7)

是的,我想你是的。表达式age<-c(5,6)确实给出了结果(来自<-的值),但由于您未能在参数列表中使用正确的赋值运算符,因此将完整表达式传递给check.names作为列的名称。它将所有无效字符转换为点。你可以阻止调用check.names(不是你通常会这样做。

> 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

答案 2 :(得分:0)

和许多语言一样,R从内到外工作。所以在x的例子中,'name'被赋值为'n1'和'n2','age'值为5和6,但是当创建data.frame时,这些列的名称被R解释为您给出的完整字符串,特殊字符变为点...最好坚持使用y示例的语法。