其实matrix可以算是array的一个特例(二维的array):
<br />
class(array(1:8, c(2,2,2))<br />
[1] "array"<br />
class(array(1:4, c(2,2))<br />
[1] "matrix"<br />
</p>
而array的本质其实是一个带有dim属性的vector(向量):
<br />
x <- 1:4<br />
class(x)<br />
[1] "integer"<br />
dim(x) <- c(2,2)<br />
class(x)<br />
[1] "matrix"<br />
attributes(x)<br />
$dim<br />
[1] 2 2<br />
class(structure(1:4, dim = c(2,2)))<br />
[1] "matrix"<br />
</p>
因此,array跟vector一样,要求所有元素都是同一种数据类型,而不能同时混有数字和字符串:
<br />
x<br />
[,1] [,2]<br />
[1,] 1 3<br />
[2,] 2 4<br />
x[2,2] <- 'a'<br />
x<br />
[,1] [,2]<br />
[1,] "1" "3"<br />
[2,] "2" "a"<br />
可见,一旦matrix(或array)的某个元素被赋予字符串,则整个向量的其他元素就都变成字符串了。</p>
为了实现混用,于是才有了list类型:
<br />
list(a = 1, b = 'a', c = matrix(1:4, 2, 2), d = list(x = 1, y = 'z'))<br />
$a<br />
[1] 1</p>
<p>$b<br />
[1] "a"</p>
<p>$c<br />
[,1] [,2]<br />
[1,] 1 3<br />
[2,] 2 4</p>
<p>$d<br />
$d$x<br />
[1] 1</p>
<p>$d$y<br />
[1] "z"<br />
然而这个类型太强大了(正如谢老大所说的通天:http://cos.name/cn/topic/101507#post-203423),什么都可以往里装(包括另一个list)。</p>
而实际运用中,更常见的是一种关系型数据,也就是看起来很像二维数组,但是每列之间可能是不同的数据类型,比如有的列是数字,有的列是字符串,有的列是日期或时间等。这就是data.frame:
<br />
DF <- data.frame(numbers = 1:4, letters = LETTERS[1:4], dates = ISOdate(2010, 4, 26:29), stringsAsFactors = F)<br />
DF<br />
numbers letters dates<br />
1 1 A 2010-04-26 12:00:00<br />
2 2 B 2010-04-27 12:00:00<br />
3 3 C 2010-04-28 12:00:00<br />
4 4 D 2010-04-29 12:00:00<br />
class(DF)<br />
[1] "data.frame"<br />
attributes(DF)<br />
$names<br />
[1] "numbers" "letters" "dates" </p>
<p>$row.names<br />
[1] 1 2 3 4</p>
<p>$class<br />
[1] "data.frame"</p>
<p>> unclass(DF)<br />
$numbers<br />
[1] 1 2 3 4</p>
<p>$letters<br />
[1] "A" "B" "C" "D"</p>
<p>$dates<br />
[1] "2010-04-26 12:00:00 GMT" "2010-04-27 12:00:00 GMT" "2010-04-28 12:00:00 GMT" "2010-04-29 12:00:00 GMT"</p>
<p>attr(,"row.names")<br />
[1] 1 2 3 4<br />
</p>