R语言笔记Day1(一 数据类型与向量)

R语言笔记(一)

1.1 数据类型

#数值型
2 3 4 5 6 7
#字符串型
"a"  "b"  "c"
#逻辑型
FALSE(F) TRUE(T) NA
判断函数
class()

小技巧 1 :在 > 后面按向上键,可以修改上一条命令重新运行

[如图所示]
修改上一条命令.png

1.2 比较运算的返回的结果是逻辑值

#   >, <, <=, >=, ==, !=
3==5      FALSE
3!=4       TRUE

1.3 逻辑运算

与&、或|、非!

多个逻辑条件的连接 与&、或|、非!
2<5&3>5    FALSE
2<5|3>5     TRUE
!2>5        TRUE

1.4 数据类型的转换与判断

  • as 族函数实现数据类型之间的转换
**1. as.numeric()**     将其他数据类型转换为数值型
**2. as.logical()**       将其他数据类型转换为逻辑型
**3. as.charactor()**  将其他数据类型转换为字符型
  • is族函数,判断,返回值为TRUE或FALSE
**1.is.numeric()**是否*数值型数据*
**2.is.logical()** 是否逻辑型数据
**3.is.charactor()** 是否字符型数据

1.5 数据的结构

Gene logFC positive group
ACTR38 -0.7488384 FALSE group1
ANLN 6.5536345 FALSE group2
BAG1 5.7768669 TRUE group3
BLC2 0.4474848 TRUE group2
BIRC5 0.4453222 TRUE group1
RAB 4.6776686 FALSE group2
ABCT 7.9993303 FALSE group2
ANF 3.5858595 FALSE group1
BALV 3.8929289 TRUE group1

1) 向量 vector
数据框中的一列,只有一种数据类型
2) 数据框 data.frame
数据框是每个组件长度都相等的列表
数据框是列表的一种,数据框每一列就是列表的一个元素,所以每一列可以是不同类型但长度要相等
3) 矩阵 matrix
多个向量组成矩阵
4) 列表 list

小技巧 2
当你打开脚本时,出现乱码,可以按照下列顺序解决

第一步:File
第二步:Reopen with Encoding
第三步:UTF-8

2.1 向量的生成

(1)用 c()逐一放到一起
> c("a","f","md","b")
[1] "a"  "f"  "md" "b" 
(2)连续的数字用冒号“:”
> 1:10
[1]  1  2  3  4  5  6  7  8  9 10
(3) 有重复的用rep(),有规律的序列用seq(),随机数用rnorm
> rep("gene",times=10)
[1] "gene" "gene" "gene" "gene" "gene" "gene" "gene" "gene" "gene" "gene"
> seq(from = 3,to = 21,by = 3)#等差数列
[1]  3  6  9 12 15 18 21
> rnorm(n = 5, mean = 3, sd = 5)
[1]  7.286638 -2.147017 10.547481  2.308747  5.017196
(4)通过组合,产生更为复杂的向量。
> paste0(rep("gene",times=15),1:15)
 [1] "gene1"  "gene2"  "gene3"  "gene4"  "gene5"  "gene6"  "gene7"  "gene8" 
 [9] "gene9"  "gene10" "gene11" "gene12" "gene13" "gene14" "gene15"

小技巧3:

1、数值1和0可被转换为逻辑值TURE和FALSE
2、仅有部分字符串可转换为数值和逻辑值
“2” “TRUE”
3、强行转换会引入NA


2.2 对单个向量进行的操作

  • 向量的赋值+输出

/规范的写法
x<-c(1,2,3)#赋值符号等号“=”是不规范的
#快捷方式是ALT 加 -
/赋值+输出
第一种
> (x <- c(1,3,5))
[1] 1 3 5
第二种
> x <- c(1,3,5);x
[1] 1 3 5
第三种
> x <- c(1,3,5)
> x
[1] 1 3 5
  • 简单的数学计算

> x <- c(1,3,5)
> x
[1] 1 3 5
> x+1   #加法
[1] 2 4 6
> log(x)   #取对数
[1] 0.000000 1.098612 1.609438
> sqrt(x)  #开平方
[1] 1.000000 1.732051 2.236068
> x %/% 10   #取整
[1] 0 0 0    
> x %% 3    #取余
[1] 1 0 2
  • 根据某条件进行判断,生成等长的逻辑向量

> x <- c(1,3,5)
> x
[1] 1 3 5
> x>3
[1] FALSE FALSE  TRUE
> x==3
[1] FALSE  TRUE FALSE
  • 初级统计

> x <- c(1,3,5);x
[1] 1 3 5
> max(x) #最大值
[1] 5
> min(x) #最小值
[1] 1
> range(x) #max和min
[1] 1 5
> which.max(x) #最大值下标
[1] 3
> which.min(x) #最小值下标
[1] 1
> mean(x) #均值
[1] 3
> median(x) #中位数
[1] 3
> var(x) #方差
[1] 4
> sd(x) #标准差
[1] 2
> sum(x) #总和
[1] 9
> sort(x)  # 排序
[1] 1 3 5
> length(x)  # 长度
[1] 3
> unique(x)  # 去重复
[1] 1 3 5
> table(x)   #  返回第一值
x
1 3 5 
1 1 1 

2.3 对两个向量进行的操作

> y=c(3,2,5)
> x=c(1,3,5)
(1)逻辑比较,生成等长的逻辑向量
> x==y
[1] FALSE FALSE  TRUE
> x %in% y #x的元素是否在y中
#对x里的每个元素进行判断,判断它是否在y中存在,存在就返回TRUE,不存在就返回FALSE”。
[1] FALSE  TRUE  TRUE
(2)数学计算
> x+y
[1]  4  5 10
(3)连接
> paste(x,y,sep=":")
[1] "1:3" "3:2" "5:5"
(4)交集、并集、差集
> intersect(x,y)
[1] 3 5
> union(x,y)
[1] 1 3 5 2
> setdiff(x,y)
[1] 1
  • 接下来引入一个概念

循环补齐

当两个向量的长度不一致时,短的自动按照之前的补齐
> y = c(3,2,5)
> x = c(1,3,5,6,2)
> x == y
[1] FALSE FALSE  TRUE FALSE  TRUE
Warning message:
In x == y : longer object length is not a multiple of shorter object length
先了解两个函数

rnorm()和sample()的区别

//rnorm(n, mean = 0, sd = 1)
n 为产生随机值个数(长度),mean 是平均数, sd 是标准差 
使用该函数的时候后,一般要赋予它3个值
例如:
> rnorm(10, mean = 4, sd = 1)
 [1] 4.334495 2.470896 3.875235 2.694793 2.930649 2.699544 3.886282 4.680146
 [9] 4.873911 3.903600

//sample(x, size, replace = FALSE, prob = NULL)
命令是从x中随机抽取size大小的样本;
replace是否放回抽样
prob 设置所要抽取的每个元素被抽取的概率
> sample(1:100,size=8)
[1] 74 22 88 46 67 18 77 53

了解下set.seed()函数
//set.seed()函数是为了保证你随机生成的随机数前后一致
set.seed()括号里面的参数可以是任意数字,是代表你设置的第几号种子而已,不会参与运算,是个标记而已。
> set.seed(5)
> rnorm(10)
 [1] -0.84085548  1.38435934 -1.25549186  0.07014277
 [5]  1.71144087 -0.60290798 -0.47216639 -0.63537131
 [9] -0.28577363  0.13810822
> set.seed(5)
> rnorm(10)
 [1] -0.84085548  1.38435934 -1.25549186  0.07014277
 [5]  1.71144087 -0.60290798 -0.47216639 -0.63537131
 [9] -0.28577363  0.13810822

下面作业来了

如何从50个数中筛选小于7的?

> x=sample(1:20,size=15);x
 [1] 11 14 18 16 17  9 10 19  4  8 20 12 15 13  5
> x<7
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
[10] FALSE FALSE FALSE FALSE FALSE  TRUE
> y=x[x<7]
> y
[1] 4 5

有一个思考题

从1000个基因名当中挑选出指定的30个
思路一:运用     %in%
step1:将1000个基因名赋值给x
step2:将指定的30个基因复制给y
step3: x %in% y     #x当中的元素是否在y中

举例说明:
>  a=c(1,2,3,4,5,6,7,8,9,10)
>  b=c(3,4,5)
> a%in%b
 [1] FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
[10] FALSE
>  a[a%in%b] #注意a、b的顺序
[1] 3 4 5
思路二:取交集
函数intersect()
> g=intersect(a,b);g
[1] 3 4 5

2.4 向量取子集(主要分为按逻辑值和下标)

1)根据逻辑值取子集
> (x <- 8:12)
[1]  8  9 10 11 12
> x[x==8:10]     # 1.1)==
[1]  8  9 10
> x[x<10]       #1.2) <
[1] 8 9
> x[x %in%c(9,13)]   #1.3) %in%
[1] 9
2)  根据位置(下标)取子集
> x[4]  #第4个位置
[1] 11
> x[2:4]  # 第2到第4
[1]  9 10 11
> x[c(1,5)]  #第1和第5
[1]  8 12
> x[-4]   # 除去第4位置
[1]  8  9 10 12
> x[-c(2:4)]  #除去第2到4位置
[1]  8 12

2.5 修改向量中的某个或某些元素

1)例子1
> (x=8:12)
[1]  8  9 10 11 12
> x[3] <- 16      #修改第3个元素;取子集+赋值
> x
[1]  8  9 16 11 12
2)例子2
> (x=8:12)
[1]  8  9 10 11 12
> x[x>10] <- 10   #将大于10的元素修改为10
> x
[1]  8  9 10 10 10
  • 练习题

1.将基因名“ACTR3B”,“ANLN”,“BAG1”,“BCL2”,“BIRC5”,“RAB”,“ABCT”,“ANF”,“BAD”,
“BCF”,“BARC7”,“BALV” 组成一个向量,赋值给x。
> x=c("ACTR3B","ANLN","BAG1","BCL2","BIRC5","RAB","ABCT","ANF","BAD","BCF","BARC7","BALV");x
 [1] "ACTR3B" "ANLN"   "BAG1"   "BCL2"   "BIRC5"  "RAB"   
 [7] "ABCT"   "ANF"    "BAD"    "BCF"    "BARC7"  "BALV" 
2.用函数计算向量长度
> length(x)
[1] 12
3.用向量取子集的方法,选出第1,3,5,7,9,11个基因名
> y=c(1,3,5,7,9,11)
> x[y]
[1] "ACTR3B" "BAG1"   "BIRC5"  "ABCT"   "BAD"    "BARC7" 
4.用向量取子集的方法,除倒数第2个以外所有的基因名
> x[-(length(x)-1)]
 [1] "ACTR3B" "ANLN"   "BAG1"   "BCL2"   "BIRC5"  "RAB"   
 [7] "ABCT"   "ANF"    "BAD"    "BCF"    "BALV" 
5.用向量取子集的方法,选出在c(“ANLN”, “BCL2”,“TP53”)中有的基因名。x %in% y ,如何确定两个向量谁在前、谁在后?
需要确定的是,你的操作对象谁,对谁进行判断?
根据题目,是对12个进行判断。所以它在前,返回的逻辑值向量长度为12,才可以将这个向量放入[ ]中,对x取子集,将对应结果为TRUE的留下,而FALSE 丢掉。
> x%in%c("ANLN","BCL2","TP53")
 [1] FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
[10] FALSE FALSE FALSE
> x[x%in%c("ANLN","BCL2","TP53")]
[1] "ANLN" "BCL2"
6.修改第6个基因名为“a” 并查看是否成功
> x[6] <- "a";x
 [1] "ACTR3B" "ANLN"   "BAG1"   "BCL2"   "BIRC5"  "a"     
 [7] "ABCT"   "ANF"    "BAD"    "BCF"    "BARC7"  "BALV" 
7.生成100个随机数: rnorm(n=100,mean=0,sd=18)
将小于-2的统一改为-2,将大于2的统一改为2
z[z< -2]=-2#这里注意赋值符号和大于号减号的区别
 z[z>2]=2

向量的进阶的几个问题

1.两个不同类型的向量合并在一起会怎么样?
> x=c(1,2,3,4,5,6)
> y=c("a","b","c","d","e","f")
> z=paste(x,y);z #注意paste()和paste0()的区别
[1] "1 a" "2 b" "3 c" "4 d" "5 e" "6 f"
> class(z)
[1] "character"
2.如何将两个向量合到一起,组成一个长向量?
> d=c(x,y);d  #未去重复值
 [1] "1" "2" "3" "4" "5" "6" "a" "b" "c" "d" "e" "f"
> union(x,y) #去重复值
 [1] "1" "2" "3" "4" "5" "6" "a" "b" "c" "d" "e" "f"
3.如何在向量首/尾/中间某位置增加一个元素?
1)首尾
x=c(3,x)
x=c(x,4)
2)中间第n 位
n=3
x=c(1,3,5,8,6)
x
[1] 1 3 5 8 6
y=c(x[1:n-1],7,x[n:length(x)])#元素为 7
y
[1] 1 3 7 5 8 6
写成函数形式
join <- function(x,n,y){
  c(x[1:n-1],y,x[n:length(x)])
}
x=c(1,3,5,8,6)
join(x,3,7)
[1] 1 3 7 5 8 6
4.如果向量x和y内容一致但顺序不一致,如何按照x的顺序排列y?
x=letters[1:5]
y=letters[c(3,1,2,5,4)]
match(x,y)  #按照x的顺序重排y
[1] 2 3 1 5 4
y[match(x,y)]
[1] "a" "b" "c" "d" "e"
5.数据框列的顺序错乱,如何重排?

步骤1: 生成示例数据框
df=data.frame(matrix(rnorm(15),ncol=5))
colnames(df)=letters[c(3,1,2,5,4)]
df
##           c          a          b          e            d
## 1 0.0791991  0.2823956  1.5775594  0.3532114  0.005290532
## 2 0.1520918 -0.5809870  0.7543086  0.2400143 -0.107861008
## 3 0.1016834 -0.5116693 -0.6895286 -0.5309626 -0.300314420
步骤2: 写出正确顺序
s=letters[1:5];s
## [1] "a" "b" "c" "d" "e"
步骤3:match排列,生成索引
sy=match(s,colnames(df));sy
## [1] 2 3 1 5 4
步骤4:取子集
基础知识:x[m,n]取子集,m表示行,n表示列,m和n的数据结构应为向量。
df2=df[,sy]
df2
##            a          b         c            d          e
## 1  0.2823956  1.5775594 0.0791991  0.005290532  0.3532114
## 2 -0.5809870  0.7543086 0.1520918 -0.107861008  0.2400143
## 3 -0.5116693 -0.6895286 0.1016834 -0.300314420 -0.5309626

部分为内容链接:https://www.jianshu.com/p/09a22a1cdcd1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容