文:庐州月光 | 编辑:湖心
本文系原创转载需授权
R语言实战专题 | 数据结构之数据框篇
数据框(data.frame)是R语言中最常见的数据类型。在工作中,通过excel保存和处理数据,相信大家都不会陌生。数据框中保存的数据和excel 文件类似。 在R语言中,有很多内置的数据集,大部分都是通过data.frame这种数据结构进行存储。> data(mtcars)
> class(mtcars)
[1] "data.frame"
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1从class
函数的结果,我们可以看出mtcars
是一个数据框类型的对象。head
函数用来查看数据框的前几行内容,可以看到数据框是一个二维的数据结构,有对应的行名称和列名称,由行和列确定一个数据的具体位置。
在向量和列表的章节中,都出现了length
和names
两个属性,当然数据框也有对应的这两个属性,只不过由于其是二维的结构,对应的属性名称有所不同。
> dim(mtcars)
[1] 32 11
> nrow(mtcars)
[1] 32
> ncol(mtcars)
[1] 11dim
函数返回数据框的维度,其实就是对应的行数和列数,nrow
和ncol
分别返回行数和列数。
> rownames(mtcars)
[1] "Mazda RX4" "Mazda RX4 Wag" "Datsun 710"
[4] "Hornet 4 Drive" "Hornet Sportabout" "Valiant"
[7] "Duster 360" "Merc 240D" "Merc 230"
[10] "Merc 280" "Merc 280C" "Merc 450SE"
[13] "Merc 450SL" "Merc 450SLC" "Cadillac Fleetwood"
[16] "Lincoln Continental" "Chrysler Imperial" "Fiat 128"
[19] "Honda Civic" "Toyota Corolla" "Toyota Corona"
[22] "Dodge Challenger" "AMC Javelin" "Camaro Z28"
[25] "Pontiac Firebird" "Fiat X1-9" "Porsche 914-2"
[28] "Lotus Europa" "Ford Pantera L" "Ferrari Dino"
[31] "Maserati Bora" "Volvo 142E"
> colnames(mtcars)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
[11] "carb"rownames
和colnames
分别返回数据框的行名称和列名称。
> mtcars[1:2, 1:2]
mpg cyl
Mazda RX4 21 6
Mazda RX4 Wag 21 6逗号之前的是行对应的下标,逗号之后的是列对应的下标。如果想要选取全部的行或者列,可以不用加任何下标。
> head(mtcars[, 1:2])
mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
> head(mtcars[1:2, ])
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4数据框的每一列是一个向量,所以数据框可以看作由列向量组成的列表。列表中元素的访问方式对于数据框同样适用。
> mtcars$mpg
[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2
[15] 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4
[29] 15.8 19.7 15.0 21.4
> mtcars[[1]]
[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2
[15] 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4
[29] 15.8 19.7 15.0 21.4
> data <- data.frame(A = 1:3, B = c("x1", "x2", "x3"), row.names=c("R1", "R2", "R3"))
> data
A B
R1 1 x1
R2 2 x2
R3 3 x3A
和B
代表数据框中的列向量,row.names
代表数据框的行名称。
R语言的主要用途之一就是数据处理,外部数据通过read.table
函数读取进入R语言中,采用data.frame
这种数据格式进行存储,这也是数据框这种结构最常用的原因。
有一个文件data.txt,内容如下:
> data <- read.table("data.txt", header = T, sep = "\t", row.names = 1)
> data
age hight grade
Andy 20 160 80
Frank 23 175 67
Brown 25 180 92read.table
函数的第一个参数为想要读取的文件的名称,header
代表是否将文件的第一行作为数据框的列名称,sep
代表文件分隔符,row.names = 1
代表使用第一列的内容作为数据框的行名称。
和read.table
函数相对应,write.table
函数将数据框的内容写到文件中。
> write.table(data, "data.csv", sep = ",")
数据框这种数据结构,是R语言与外部世界沟通的桥梁。这是由于数据框的这种特性,才导致数据框成为使用最广泛的数据结构。