R语言入门教学(4)-R的数据结构

前言:经过之前的学习,大家应该大概对R有了一些了解,但是又会感觉懵懵懂懂,这很正常,学习一门语言的路很长,并不能通过一早一夕变进步神速,贵在持之以恒。但无论学什么,基础一定要打好。学知识切记不可如空中楼阁,这会很影响我们向更高层进步。如果凡事只学习应用而不学习背景与基础,也许在面对某些特定项目时,你表现的和别人的水平并无很大差距,但是遇到新知识时,接收能力却会和别人有天壤之别。

今天所写的是一些很基础的知识,并无涉及到代码问题,而是加强大家对R语言结构的认知。

R语言的数据结构详解:

1.向量(vector)

向量是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"

2.因子(factor)

# 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"  #因子

3. 列表(list)

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"

4.数据框(dataframe)

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

5. 矩阵(matrix)与数组(array)

矩阵就像我们数学里的矩阵一样,如:

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一般多用于数学计算,所以里面一般多是数值型数据。


ALL IN ALL

就我个人看法, dataframe的应用是最广泛的,读取file(csx,xlsx,txt,dat等)都是dataframe的格式,而R最好的是,数据都是带顺序的,提取起来非常方便,这也是R这种天生为数据统计设计的软件的优势以及特点。






猜你喜欢

转载自blog.csdn.net/clintlong/article/details/80972553