R语言之基础

Python013

R语言之基础,第1张

向量是 R 语言中最基本的数据类型,在 R 中没有单独的标量(例如 1 本质上是 c(1)) 。

R 中可以用 = 或者 <- 来进行赋值 , <-的快捷键是 alt + - 。

R的下标是从1开始的,和python等不同(python四从0开始的)

当然我们也可以用逻辑进行筛选,例如

负数下标表示不选这个这些下标,例如:

c() 可以合并向量,例如

向量有个比较有趣的性质,当两个向量进行操作时,如果长度不等, 长度比较短的一个会复制自己直到自己和长的一样长。

a 自动变成了 c(3,4,3,4) 然后与b相加 , 得到了下面的结果。

遇到不懂得函数,可以用help("函数")查看函数用法。

矩阵,从本质上来说就是多维的向量,我们来看一看 我们如何新建一个矩阵。

可以看到向量元素变为矩阵元素的方式是按列的,从第一列 到第二列,如果我们想按行输入元素,那么需要加入 byrow = TRUE 的参数:

与向量相似,我们可以用下标来筛选矩阵, 例如:

a[行,列]

当我们对两个矩阵相乘,我们得到的结果是 对应元素两两相乘的结果,例如:

而这不是我们想要的矩阵乘法,在 R 中我们在乘法旁边加两个 百分号来做矩阵乘法:

此外,我们可以用 t() 来求矩阵的转置 , 用 solve() 来求矩阵的逆。

数据框类似矩阵,与矩阵不同的是,数据框可以有不同的数据类型。 一般做数据分析,我们把一个类似 excel 的表格读入 R ,默认的格式 就是数据框 , 可见数据框是一个非常重要的数据结构。

一般来说我们需要分析的数据,每一行代表一个样本,每一列代表一个 变量。

下面我们用 R 内置的数据集 iris 来看一看数据框的使用。

我们用 data 函数调入了 iris 这个数据集 , 然后用 head 函数来看一看这个数据 的前几行 , 可以看到有 sepal 的长度,宽度,petal 的长度和宽度,还有一个变量 Species 来描述样本的类别。

我们可以用 summary 函数来对数据集做大致的了解。

可以直观地看到每个变量的信息,对于几个数值变量,我们可以看到最小值,中位数等等统计信息。而对于 Species 这个分类变量,我们看到的是计数信息。

筛选数据框与矩阵相似,都可以通过数字下标来获取子集,不同地是因为数据框有不同的列名,我们也可以通过列名来获取某一特定列,例如:

我们可以用 names() 函数来获取数据框的列名

并可以通过为其赋值改变列的名字。

列表是一种递归式的向量,我们可以用列表来存储不同类型的数据,比如:

列表有多种索引方式,可以用如下方式获取。

今天我们实验的对象就是一组从原始 R 进化出来的工具链 Tidyverse , 它是由 Hadley Wickham 主导开发的一系列 R 包的集合。 Tidyverse 继承了R语言进行快速统计分析的优势 , 并实现了一些新的理念 , 例如 magrittr 包中的管道操作 , 让线性嵌套的函数组合变得更加清晰易懂;可视化方面中的 ggplot ,使绘图变成搭积木式的图层叠加。

这样的小发明有的改变了分析的运作方式 , 有的改变了使用者的认知方式 , 聚在一起形成了一种新的数据分析的生态链 。具体来看 , Tidyverse 有如下核心组件:

mpg 数据集是刻画不同汽车的排放状况的一个数据集, 总过有 234 个样本 , 11 个变量 。 这 11 个变量分别是:

manufacture: 制造商

model: 车型

dispel: 汽车排放量

year: 制造年度

cyl: 排气管数量

trans: 排放类型

drv: 驱动方式

cty: 每公里耗油量(城市道路)

hwy: 每公里耗油量(高速路)

fl: 油的种类

class: 车的类型

更多数据相关信息可以通过 help(mpg) 指令获取。

在属性映射中加入 color=class 参数后 , 我们可以看到每个点的汽车对应的类型被用 不同颜色表现了出来 , 对于散点图 , 还有 size(大小) , shape(形状) 等等参数 可以用于确定点的属性。

对于条形图的y轴就是数据框中原本的数值时,必须将geom_bar()函数中stat(统计转换)参数设置为’identity’,即对原始数据集不作任何统计变换,而该参数的默认值为’count’,即观测数量。

我的亲师弟最近也开始学习R语言了,然后师弟每天“师姐,师姐...",“我这个怎么弄...”,“我怎么又报错了...”,“师姐师姐...”...我快被他搞疯了,于是有了这篇文章。

新手在学习R语言的过程中一定会出现各种各种问题,问题多到令人抓耳挠腮。

但其实不要觉得害怕或有打退堂鼓的心里,R的使用,就是不断报错不断找问题的过程。但是出现问题,第一反应一定要是上网搜索,找答案,不要第一时间就问身边的人,错失了思考的过程。生信的学习,其实就是一个漫长的自学过程。

推荐 搜索引擎:必应,必应,必应 !不要再用某度啦拜托!当然如果你能想办法用Google,那当然再好不过了。

搜索能解决百分之九十以上的问题 ,就算解决不了,如果解决不了,可能是因为你的搜索能力还不够高。在这个搜索、尝试解决以及思考的过程,对新学者来说也是一大收获。本身搜索能力的提升就是一个巨大收获。

如果自己尝试了好久,最终实在解决不了,那。。。就再去请教有经验的前辈吧~

其实这种搜索并独立解决问题的思维,我还是在同济大学, 生信大牛刘小乐教授 课题组学到的。刘小乐教授课题组每年都有为期一个月的生信培训,本人有幸学习过一段时间。她们会给很多生信相关的题目给到学员,然后附上一些教学视频,培训的大部分时间,其实就是写作业,自己想方设法找到解决方案的过程。那些大牛师兄师姐们虽然一直在陪伴我们,但是并不会直接告诉我们答案,而是引导我们自己思考,自己去解决。当时真的很崩溃,因为真的啥也不会,怎么搞。一天下来有可能一个问题都答不上来。

但是现在回头想想,我真的获益良多。因为我慢慢学会了独立思考,现在遇到R相关的问题,配合上搜索功能,基本上已经完全能自己驾驭了。

这可能就是“ 授人以鱼不如授人以渔 ”的道理吧。

R语言很简单,只要你想学,就一定能学会。

以下附上同济大学刘小乐课题组在培训时针对初学者第一周的初级练习题。希望对大家有所帮助。

首先你需要先安装几个最常用的数据处理软件

You can use the mean() function to compute the mean of a vector like

so:

However, this does not work if the vector contains NAs:

Please use R documentation to find the mean after excluding NA's (hint: ?mean )

In this question, we will practice data manipulation using a dataset

collected by Francis Galton in 1886 on the heights of parents and their

children. This is a very famous dataset, and Galton used it to come up

with regression and correlation.

The data is available as GaltonFamilies in the HistData package.

Here, we load the data and show the first few rows. To find out more

information about the dataset, use ?GaltonFamilies .

a. Please report the height of the 10th child in the dataset.

b. What is the breakdown of male and female children in the dataset?

c. How many observations are in Galton's dataset? Please answer this

question without consulting the R help.

d. What is the mean height for the 1st child in each family?

e. Create a table showing the mean height for male and female children.

f. What was the average number of children each family had?

g. Convert the children's heights from inches to centimeters and store

it in a column called childHeight_cm in the GaltonFamilies dataset.

Show the first few rows of this dataset.

In the code above, we generate r ngroups groups of r N observations

each. In each group, we have X and Y, where X and Y are independent

normally distributed data and have 0 correlation.

a. Find the correlation between X and Y for each group, and display

the highest correlations.

Hint: since the data is quite large and your code might take a few

moments to run, you can test your code on a subset of the data first

(e.g. you can take the first 100 groups like so):

In general, this is good practice whenever you have a large dataset:

If you are writing new code and it takes a while to run on the whole

dataset, get it to work on a subset first. By running on a subset, you

can iterate faster.

However, please do run your final code on the whole dataset.

b. The highest correlation is around 0.8. Can you explain why we see

such a high correlation when X and Y are supposed to be independent and

thus uncorrelated?

Show a plot of the data for the group that had the highest correlation

you found in Problem 4.

We generate some sample data below. The data is numeric, and has 3

columns: X, Y, Z.

a. Compute the overall correlation between X and Y.

b. Make a plot showing the relationship between X and Y. Comment on

the correlation that you see.

c. Compute the correlations between X and Y for each level of Z.

d. Make a plot showing the relationship between X and Y, but this

time, color the points using the value of Z. Comment on the result,

especially any differences between this plot and the previous plot.

1、向量是用于存储数值型,字符型或者逻辑型数据的一维数组。执行组合功能的函数为c(),可以用来创建向量。向量可根据位置进行索引,需要用[]。 2、矩阵是一个二维数组,每个元素都拥有相同的模式,可通过函数matrix()创建矩阵。 3、数组是一个可以在两个以上维度存储数据的数据对象。例如,如果创建尺寸(2,3,4)的数组,那么就是创建4个矩形矩阵每个2行3列。数组只能存储数据类型。 4、矩阵和数组一样都只能包含一种数据类型,当有多种模式的数据时,使用数据框就更为方便。数据框可以用函数data.frame () 创建。 5、$  被用来选取一个给定数据框中的某个特定变量。 6、attach()绑定数据集,detach()解除数据集。 7、with:attach,detach最好在单独的数据框内使用,在多个同名对象最好不要使用,函数with(),可以再具有多个同名对象的数据框内使用,但是必须加入花括号{},这样就无须担心名称冲突了,但是它也有局限性,赋值仅在此函数的括号内生效。 8、列表是一些对象的有序集合。 9,、数据导入 read.table(),其中header = T,代表第一行为变量名称,不作为数据,header = F相反。sep代表数据分隔符,txt为"\t",csv为","。 10、table函数,用 table() 函数统计因子各水平的出现次数(称为频数或频率)。 >sex = c("女","女","女","男","男") >table(sex) >sex   男 女   2 3 求众数 >aim = table(sex)[table(sex)==max(table(sex))] >aim   女    3 > max(table(sex)) [1] 3 > table(sex)==max(table(sex))   sex   男    女   FALSE TRUE 11、 无尺度网络: 是指在某一复杂的 系统 中,大部分节点只有少数几个连结,而某些节点却拥有与其他节点的大量连结。这些具有大量连结的节点称为“集散节点”,所拥有的连结可能高达数百、数千甚至数百万。这一特性说明该网络是无尺度的,因此,凡具有这一特性的网络都是无尺度网络。 12、options(stringsAsFactors = F) #在调用as.data.frame的时,将stringsAsFactors设置为FALSE可以避免character类型自动转化为factor类型。 13、class():查看数据结构:vector、matrix、array、dataframe、list。 14、str():作用用英语来表示是:check classification of viriables,一般用于检查数据框当中有哪些数据。 15、mode() :查看数据元素类型。 16、typeof() :查看数据元素类型,基本等同于mode(),比mode()更为详细。 17、example():假设有一个函数foo,example("foo"),函数foo的使用示例。 18、apropos():列出名称中含有foo的所有可用函数。apropos("foo",mode="function")。 19、data():列出当前已加载包中所含的所有可用示例数据集。 20、ls():列出当前工作空间中的对象。 21、rm():移除(删除)一个或多个对象。 22、history(#):显示最近使用过的#个命令(默认值为25)。 23、options():显示或设置当前选项。有一个收藏文件有介绍options的功能。 24、boxplot():生成盒型图。 25、sum():计算和。sum(x,na.rm = TRUE)。 26、median():计算中位数。 27、cbind():以列结合变量。cbind(x,y,z)。 28、rbind():以行结合变量。 29、vector():以向量形式结合数据。vector(length = 10)。 30、rep():以矩阵形式结合数据。rep(c(1,,2,3),each = 10) 31、seq():生成一个有序的数列。seq(1,10)。 32、dim():矩阵或者cbind输出的维数。dim(Mydata)。 33、scan():从ascii文件中读取数据。scan(file = "test.txt")。 34、write.table():把一个变量写入到ascii文件。write.table(Z,file = "test.txt")。 35、order():确定数据的顺序。order(x)。 36、merge():合并两个数据框。merge(x,y,by = "ID")。 37、str():显示一个对象的内部结构。str(Mydata)。 38、factor():定义变量作为因子。factor(x)。 39、tapply():tapply(X = Veg$R,INDEX = Veg$Transect,FUN = mean).tapply函数根据第二个变量(Transect)的不同水平对第一变量(R)进行了求平均值运算。还可以求sd,var,length等操作。R语言初学者指南P75详细介绍了这个函数。 40、下一页介绍了sapply和lapply。 41、summary():计算基本信息。 42、table():计算列联表,统计因子各水平的出现次数(频数或频率)。table(x,y)。 43、plot():y对x的图形。pch形状,col颜色。 44、par():par(mfrow = c(2,2),mar = c(3,3,2,1)) mfrow生成一个具有4个面板的图形窗口。mar选项指定每个图形周围空白的大小,底部、左侧、顶部、右侧。 45、paste():将变量连接成字符串。paste("a","b",sep = "")。 46、log(): log = "x",log = "y",log = "xy",生成对数轴。 47、%in%: a<-c(1,3,13,1443,43,43,4,34,3,4,3) b<-c(1,13,11,1313,434,1) a%in%b # 返回内容#  [1] TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # 取反操作 !(a%in%b) 48、sort()函数是对向量进行从小到大的排序 rank()函数返回的是对向量中每个数值对应的秩 order()函数返回的值表示位置,依次对应的是向量的最小值、次小值、第三小值……最大值等(位置索引) arrange()函数(需加载dplyr包)针对数据框,返回基于某列排序后的数据框,方便多重依据排序。 49、subset(): df <- data.frame( a = 1:10, b = 2:11, c = 3:12 )df <- subset(df, select = c(a,c)) #选取列a和c df <- subset(df, select = -c(a,c) ) #去除列a和c