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

Bqs*_*jbq 2 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
Run Code Online (Sandbox Code Playgroud)

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

ags*_*udy 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))
Run Code Online (Sandbox Code Playgroud)

这相当于:

 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)
Run Code Online (Sandbox Code Playgroud)

然后为y

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

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

         a <- data.frame(y <- list(x=1)) 
         a <- data.frame(y = list(x=1)) 
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)