Adata.frame是一种特殊的列表:它是矩形。列表的每个元素(列)具有相同的长度,并且每一行都有一个“行名”。每个列都有其自己的类,但是一个列的类可以与另一列的类不同(与矩阵不同,在矩阵中,所有元素都必须具有相同的类)。
原则上,adata.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
现在很明显,我们有一个data.frame3行2列的。您可以检查此使用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提供了另外两个structure()可用于创建data.frame的函数(之外)。第一个直观地称为。它检查以确保您提供的列名有效,列表元素的长度均相同,并提供一些自动生成的行名。这意味着现在的输出可能始终与您期望的一样: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
另一个功能称为。通过将其运行,可以将非a的对象强制为a 。例如,考虑一个矩阵:as.data.frame()data.framedata.framedata.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