向量是R最基本的数据结构,包括之前教的复制x<- 1, 此时的x便是一个向量(vector)。 vector的数据有几种种类,如 numeric(数值)、character(字符)、logical(逻辑,如TRUE FALSE)、NULL(空)、NA(缺失值)。通过c()函数可以一次性赋值很多个值,如:
subject_name <- c("John Doe", "Jane Doe", "Steve Graves")
temperature <- c(98.1, 98.6, 101.4)
flu_status <- c(FALSE, FALSE, TRUE)
这三个变量都是vector,我们可以通过class()函数来看变量的类型:
class(subject_name)
[1] "character"
特点:vector是一维的,且同一个vector只能有一种类型的值组成,如果我们这样子赋值:
a<- c(2,'s',TRUE)
a
[1] "2" "s" "TRUE"
class(a)
[1] "character"
2本是numeric的数据,而TRUE是逻辑类型,这里全部被强行转换成了character,这是因为vector只能有一种类型的数据。
R里的数据是有顺序的,想要提取向量(vector)里面的数据,我们可以:
a[2]
[1] "s"
想要删除数据,可以:
a<- a[-2]
a
[1] "2" "TRUE"
# add gender factor
gender <- factor(c("MALE", "FEMALE", "MALE"))
gender
[1] MALE FEMALE MALE
Levels: FEMALE MALE
# add blood type factor
blood <- factor(c("O", "AB", "A"),
levels = c("A", "B", "AB", "O"))
blood [1] O AB A Levels: A B AB O
如上代码所赋值的变量就是因子,fatctor。 很容易理解factor应该被使用的地方, 如上性别,我们往往需要知道的是有多少个男和女,并不需要一股脑呈现出如:男、男、男、女、男、女 这种类型(这是vector)的数据,更希望的是男(4)、女(2)这是factor。 就像上面血型blood变量一样,里面没有B型,但是按道理血型应该有B型,于是如果我们:
table(blood)
blood
A B AB O
1 0 1 1 #B型血显示为0
如果我们需要给levels定一个高低,我们可以:
# add ordered factor
symptoms <- factor(c("SEVERE", "MILD", "MODERATE"),
levels = c("MILD", "MODERATE", "SEVERE"),
ordered = TRUE) #加了ordered=T
symptoms
[1] SEVERE MILD MODERATE
Levels: MILD < MODERATE < SEVERE
# check for symptoms greater than moderate
symptoms > "MODERATE" #结果为 [1] TRUE FALSE FALSE
查看变量类型:
class(blood)
[1] "factor" #因子
list与vector很像,区别在于list可以含有不同类别的数值,如:
subject1 <- list(fullname = subject_name[1], #character
temperature = temperature[1], #numeric
flu_status = flu_status[1], #logic
gender = gender[1], #factor
blood = blood[1],
symptoms = symptoms[1])
class(subject1)
[1] "list"
dataframe是我们用的最多的数据结构,因为它能包含的信息很多,结合了vector以及list的特点,它是二维的。dataframe可以含有不同类别的数值,但是同一列(column)只能含有一种类别,同一行(row)可以含有多种类别。我们可以理解为列就像vector,而行像list。并且,每一列都需要同长度。
pt_data <- data.frame(subject_name, temperature, flu_status, gender,
blood, symptoms, stringsAsFactors = FALSE)
# display the data frame
pt_data
subject_name temperature flu_status gender blood symptoms
1 John Doe 98.1 FALSE MALE O SEVERE
2 Jane Doe 98.6 FALSE FEMALE AB MILD
3 Steve Graves 101.4 TRUE MALE A MODERATE
class(pt_data)
[1] "data.frame"
要提取dataframe中的数值非常方便,而且方法很多:
# get several columns by specifying a vector of names
pt_data[ ,c("temperature", "flu_status")] #有逗号
temperature flu_status
1 98.1 FALSE
2 98.6 FALSE
3 101.4 TRUE
pt_data[c("temperature", "flu_status")] #效果同上,但我不推荐使用
# this is the same as above, extracting temperature and flu_status
pt_data[2:3]#效果同上,但我不推荐使用
pt_data[ ,c(2:3)] #效果同上 ,有逗号
一开始说过,基础要打好,那么习惯就得养成好。 我不推荐使用的表达方式,是因为dataframe是二维的,那么它就应该有x和y(行与列)的区别,虽然上诉的一些方法一样可以提取出这个dataframe的2、3列,但是它并没有很好地表现出来dataframe的二维性。 一般来说,提取dataframe中的数据我们使用逗号来区别行与列,如我想要第一行,第二列的数据,那么我们只能:
# accessing by row and column
pt_data[1, 2]
pt_data[c(1, 3), c(2, 4)] #1,3 行的2,4列数据
逗号前是行,逗号后是列,需要所有行,可以写成:
pt_data[ , 2] #留空代表取所有行
pt_data[ , ] #效果等同于 pt_data
矩阵就像我们数学里的矩阵一样,如:
m <- matrix(c(1, 2, 3, 4), nrow = 2)
m
[,1] [,2]
[1,] 1 3
[2,] 2 4
nrow=2的意思是 2行,可以发现,matrix的形成是按列来的,先将1,2填进第一列,再形成第二列3,4. 那是因为matrix()方程里面实际上有matrix(byrow= F)这个设定,如果我们:
# create a 2x2 matrix
m <- matrix(c(1, 2, 3, 4), nrow = 2, byrow = T)
m
[,1] [,2]
[1,] 1 2
[2,] 3 4
可以发现区别。array和matrix有类似,但是array不仅仅是二维,而是可以多维,这里不做深究。
matrix一般多用于数学计算,所以里面一般多是数值型数据。
就我个人看法, dataframe的应用是最广泛的,读取file(csx,xlsx,txt,dat等)都是dataframe的格式,而R最好的是,数据都是带顺序的,提取起来非常方便,这也是R这种天生为数据统计设计的软件的优势以及特点。