在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; - 和=之间有什么区别?
答案 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)