创建一个空的 data.frame
data.frame 是一种特殊的列表:它是矩形的。列表的每个元素(列)具有相同的长度,并且每行具有行名称。每列都有自己的类,但是一列的类可以与另一列的类不同(与矩阵不同,其中所有元素必须具有相同的类)。
原则上,data.frame 可以没有行也没有列:
> structure(list(character()), class = "data.frame")
NULL
<0 rows> (or 0-length row.names)
但这很不寻常。data.frame 更常见的是有很多列和很多行。这是一个包含三行和两列的 data.frame(a
是数字类,b
是字符类):
> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame")
[1] a b
<0 rows> (or 0-length row.names)
为了打印 data.frame,我们需要提供一些行名称。这里我们只使用数字 1:3:
> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame", row.names = 1:3)
a b
1 1 a
2 2 b
3 3 c
现在很明显,我们有一个包含 3 行和 2 列的 data.frame。你可以使用 nrow()
,ncol()
和 dim()
来检查:
> x <- structure(list(a = numeric(3), b = character(3)), class = "data.frame", row.names = 1:3)
> nrow(x)
[1] 3
> ncol(x)
[1] 2
> dim(x)
[1] 3 2
R 提供了另外两个可用于创建 data.frame 的函数(除了 structure()
)。第一个是直观地称为 data.frame()
。它会检查以确保你提供的列名有效,列表元素的长度都相同,并提供一些自动生成的行名。这意味着 data.frame()
的输出现在可能总是完全符合你的预期:
> str(data.frame("a a a" = numeric(3), "b-b-b" = character(3)))
'data.frame': 3 obs. of 2 variables:
$ a.a.a: num 0 0 0
$ b.b.b: Factor w/ 1 level "": 1 1 1
另一个函数叫做 as.data.frame()
。这可以用于通过 data.frame()
运行将不是 data.frame 的对象强制为 data.frame。例如,考虑一个矩阵:
> m <- matrix(letters[1:9], nrow = 3)
> m
[,1] [,2] [,3]
[1,] "a" "d" "g"
[2,] "b" "e" "h"
[3,] "c" "f" "i"
结果如下:
> as.data.frame(m)
V1 V2 V3
1 a d g
2 b e h
3 c f i
> str(as.data.frame(m))
'data.frame': 3 obs. of 3 variables:
$ V1: Factor w/ 3 levels "a","b","c": 1 2 3
$ V2: Factor w/ 3 levels "d","e","f": 1 2 3
$ V3: Factor w/ 3 levels "g","h","i": 1 2 3