2

在 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 中 <- 和 = 之间的区别是什么?

4

3 回答 3

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 

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

         a <- data.frame(y <- list(x=1)) 
         a <- data.frame(y = list(x=1)) 
于 2012-12-30T07:50:46.180 回答
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
于 2012-12-30T07:54:54.683 回答
0

R,像许多语言一样,由内而外地工作。所以在你的 x 示例中,'name' 被分配了 'n1' 和 'n2' 的值,以及 5 和 6 的 'age' 值,但是当数据.frame 创建后,R 将这些列的名称解释为您提供的完整字符串,其中特殊字符变为点...最好坚持使用 y 示例的语法。

于 2012-12-30T08:13:56.753 回答