R语言数据类型特性对比


Notice: Undefined offset: 2 in /www/web/hicmnt/public_html/wp-includes/class-wp-embed.php on line 334

dataframe与matrix

data frame本质上是list(可以使用typeof(df)查看),不同之处在于:
● list的元素名可以重复,data frame列名必须唯一
● 所有的data frame列都是list # y<-data.frame(matrix(data=1:9,nrow=3,ncol=3)) as.list(y)
● data frame各列长度必须相等
因为这些限制特性,所以可以用data frame模仿matirx的一些行为,可以进行行选择和对行进行操作(list不能行操作)。data frame最常见的情形是存放观测值(关系型数据)。
matrix本质上是增加了一些方法的vector,只能是一种数据类型,所有占用空间少,运算速度快,适合做统计模拟的时候用
m <- matrix(1:400000, 200000, 2)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 1600776 bytes

vector转换为dataframe

如果需要把vector转换为dataframe,必须先转换为matrix,然后再转换为data frame,如:data.frame(matrix(data=1:9,nrow=3,ncol=3))

apply与sapply

apply与sapply在对data frame进行操作时会表现出比较明显的区别
apply(iris,2,class) # apply会把第一个参数对象的类型自动转换为matrix,而matrix的元素只有一种class,如果元素中既有character类型又有numeric类型,matrix会自动转换为character类型
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
“character” “character” “character” “character” “character”
sapply(iris,class) # sapply是对list的每个元素进行操作
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
“numeric” “numeric” “numeric” “numeric” “factor”

data.frame()与as.data.frame()

首先需要说明,两者不是完全一样的,如下例:
x <- matrix(data=rep(1,9),nrow=3,ncol=3)
identical(data.frame(x),as.data.frame(x))
[1] FALSE
【1】data.frame()调用了as.data.frame();【2】data.frame()可以用于构造一个data frame,as.data.frame()只是转换现有的其他类的对象到data frame
as.data.frame()将一个其他类的对象转换为data.frame类,默认支持的其他类可通过methods(as.data.frame)查看【3】上面identical(data.frame(x),as.data.frame(x))之所以不同,在于names的不同

例2:
A <- data.frame(a=LETTERS[1:5], b=1:5, c=rnorm(5))
B <- data.frame(a=letters[1:5], b=sample(1:2, size=5, replace=TRUE))
c(A, B) # creates a list, c(A)is also create a list

> class(c(A, B))
“list”
AB1 <- as.data.frame(c(A, B))
AB2 <- data.frame(A, B)

> identical( AB1, AB2 )
[1] TRUE

Array

发表评论