创建一个空的 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