fix()与edit()的区别

  • edit修改完关闭编辑器后,并不会保存你的修改
  • fix修改完关闭编辑器后就会直接保存你的修改

R语言中的逻辑运算符

Operator Description
< 小于、less than
<= 小于等于、less than or equal to
> 大于、greater than
>= 大于等于、greater than or equal to
== 相等、exactly equal to
!= 不相等、not equal to
!x 非、Not x
x | y 或、x OR y
x & y 与、x AND y
isTRUE(x) 测试是否为真(True)、test if X is TRUE

数据排序

order()

1
2
3
4
5
6
7
8
9
# 以mtcars数据为例对数据进行排序
attach(mtcars) # 固定数据集
# 按变量mpg排序
newdata <- mtcars[order(mpg),]
# 按变量mpg和cyl排序
newdata <- mtcars[order(mpg, cyl),]
#按变量mpg(升序)和cyl(降序)排序
newdata <- mtcars[order(mpg, -cyl),]
detach(mtcars) # 解固定数据集

数据合并

向数据框添加列,通常用于向数据框中添加变量

  • merge() 函数
    • 数据帧必须具有相同的列名称,在其上进行合并
  • cbind() 函数
    • 两数据框的行数相同,并且位置已经匹配完成

向数据框中添加行,纵向联结通常用于向数据框中添加观测

  • rbind() 函数
    • 两个数据框必须拥有相同的变量,并且位置已经匹配完成

merge()

base 包(merge)

语法

1
2
3
4
merge(x, y, by = intersect(names(x), names(y)),
by.x = 列名1, by.y = 列名2, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
incomparables = NULL, ...)

属性

  • x,y:要合并的两个数据集
  • by:用于连接两个数据集的列,intersect(a,b)值向量a,b的交集,names(x)指提取数据集x的列名
  • by:intersect(names(x), names(y)) 是获取数据集x,y的列名后,提取其公共列名,作为两个数据集的连接列, 当有多个公共列时,需用下标指出公共列,如names(x)[1],指定x数据集的第1列作为公共列。也可以直接写为 by = “公共列名” ,前提是两个数据集中都有该列名,并且大小写完全一致,R语言区分大小写
  • by.x,by.y:指定依据哪些列关联数据框,默认值为相同列名的列
  • all,all.x,all.y:指定x和y的行是否应该全在输出文件
  • sort:by指定的列(即公共列)是否要排序
  • suffixes:指定除by外相同列名的后缀;如设置 suffixes = c(“.xx”, “.yy”),两个数据框都有列名 grade,关联后就会被区分为 grade.xx 和 grade.yy
  • incomparables:指定by中哪些单元不进行关联

常用的参数

  • by
    • 根据相同列名的列进行关联
  • by.x/by.y

    • 可以分别指定两个数据框的列进行关联
  • all/all.x/all.y

    • 逻辑变量,控制返回 x 和 y 所有/仅 x 数据框/仅 y 数据框的行
  • sort

    • 逻辑变量,根据关联的列进行排序

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
grade1 <- data.frame(number = c(2, 3, 1), Names = c("小明", "小红", "小李"), math = c(90, 80, 100))
grade2 <- data.frame(number = c(3, 1, 4), NAMES = c("小红", "小李", "小张"), english = c(100, 90, 80))
grade3 <- data
# 两个数据框定义了学号、姓名和成绩
grade1
# number Names math
# 1 2 小明 90
# 2 3 小红 80
# 3 1 小李 100
grade2
# number NAMES english
# 1 3 小红 100
# 2 1 小李 90
# 3 4 小张 80

merge(grade1, grade2)
# number Names math NAMES english
# 1 1 小李 100 小李 90
# 2 3 小红 80 小红 100

默认时根据同名列进行关联,在上例中Names和NAMES由于大小写不一致,因此未关联,解决这个问题我们可以使用by.x、by.y关联。

1
2
3
4
merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"))
# number Names math english
# 1 1 小李 100 90
# 2 3 小红 80 100

通过 all/all.x/all.y 指定保留我们想要的行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"),
all = T) # 返回并集(保留所有行)
# number Names math english
# 1 1 小李 100 90
# 2 2 小明 90 NA
# 3 3 小红 80 100
# 4 4 小张 NA 80
# 使用 NA 填补了缺失值

merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"),
all.x = T) # 仅保留 x 数据框的所有行
# number Names math english
# 1 1 小李 100 90
# 2 2 小明 90 NA
# 3 3 小红 80 100
# 保留了 x 的所有行,因此小明的成绩被留下了

merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"),
all.y = T) # 仅保留 y 数据框的所有行
# number Names math english
#1 1 小李 100 90
#2 3 小红 80 100
#3 4 小张 NA 80

最后我们通过 sort 对关联的变量进行排序。

默认 sort = T,将 by 中的第一个变量作为第一依据,第二个变量作为第二依据,以此类推进行排序。

注意观察下述代码与之前的差异:

1
2
3
4
5
6
7
merge(grade1, grade2, by.x = c("Names", "number"), by.y = c("NAMES", "number"),
all = T)
# Names number math english
# 1 小红 3 80 100
# 2 小李 1 100 90
# 3 小明 2 90 NA
# 4 小张 4 NA 80

cbind()

1
2
3
4
5
6
7
8
# Create vector objects.
city <- c("Tampa","Seattle","Hartford","Denver")
state <- c("FL","WA","CT","CO")
zipcode <- c(33602,98104,06161,80294)

# Combine above three vectors into one data frame.
addresses <- cbind(city,state,zipcode)
addresses
1
2
3
4
5
     city       state zipcode
[1,] "Tampa" "FL" "33602"
[2,] "Seattle" "WA" "98104"
[3,] "Hartford" "CT" "6161"
[4,] "Denver" "CO" "80294"

rbind()

1
2
3
4
5
6
7
# Create another data frame with similar columns
new.address <- data.frame(
city = c("Lowry","Charlotte"),
state = c("CO","FL"),
zipcode = c("80230","33949"),
stringsAsFactors = FALSE
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new.address
city state zipcode
1 Lowry CO 80230
2 Charlotte FL 33949
# Combine rows form both the data frames.
all.addresses <- rbind(addresses,new.address)
all.addresses
city state zipcode
1 Tampa FL 33602
2 Seattle WA 98104
3 Hartford CT 6161
4 Denver CO 80294
#5、6为合并进来的行
5 Lowry CO 80230
6 Charlotte FL 33949

数据集取子集

构建数据框

1
2
3
4
5
6
7
8
9
10
11
12
13
PatientID<-c(1,2,3,4,5,6)
Data<-c("03/20/20","03/21/20","03/22/20","03/23/20","03/24/20","03/25/20")
Age<-c(18,25,26,35,48,50)
Gender<-c("M","F","F","M","F","M")
City<-c("福州","厦门","泉州","龙岩","漳州","三明")
Pr1<-c("69","57","67","65","72","55")
Pr2<-c("180","155","159","184","167","175")
Pr3<-c("11","14","34","23","35","12")
Pr4<-c("6","7","5","8","6","9")
Pr5<-c("20","34","35","56","47","19")
S1<-c(88,78,NA,56,45,60)
S2<-c(67,87,45,25,NA,96)
mydata<-data.frame(PatientID,Data,Age,Gender,City,Pr1,Pr2,Pr3,Pr4,Pr5,S1,S2)
1
2
3
4
5
6
7
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2
1 1 03/20/20 18 M 福州 69 180 11 6 20 88 67
2 2 03/21/20 25 F 厦门 57 155 14 7 34 78 87
3 3 03/22/20 26 F 泉州 67 159 34 5 35 NA 45
4 4 03/23/20 35 M 龙岩 65 184 23 8 56 56 25
5 5 03/24/20 48 F 漳州 72 167 35 6 47 45 NA
6 6 03/25/20 50 M 三明 55 175 12 9 19 60 96

选入(保留)变量

方法一

1
2
3
newdata1<-mydata[,c(6:10)]#其中的“,”表示默认选择所有行
> newdata1
newdata1
1
2
3
4
5
6
7
  Pr1 Pr2 Pr3 Pr4 Pr5
1 69 180 11 6 20
2 57 155 14 7 34
3 67 159 34 5 35
4 65 184 23 8 56
5 72 167 35 6 47
6 55 175 12 9 19

方法二

1
2
3
newdata3<-paste("Pr",1:5,sep="")
newdata3<-mydata[newdata3]
newdata3
1
2
3
4
5
6
7
8
9
10
11
> newdata3<-paste("Pr",1:5,sep="")
> newdata3
[1] "Pr1" "Pr2" "Pr3" "Pr4" "Pr5"
---
Pr1 Pr2 Pr3 Pr4 Pr5
1 69 180 11 6 20
2 57 155 14 7 34
3 67 159 34 5 35
4 65 184 23 8 56
5 72 167 35 6 47
6 55 175 12 9 19

方法三

1
2
3
newdata2<-c("Pr1","Pr2","Pr3","Pr4","Pr5")
newdata2<-mydata[newdata2]
newdata2

剔除(丢弃)变量

若某个变量出现缺失值,在进一步分析之前可能需要丢掉

方法一

1
2
3
newdata4<-names(mydata)%in%c("Pr2","Pr4")
newdata5<-mydata[!newdata4]
newdata5
1
2
3
4
5
6
7
  PatientID     Data Age Gender City Pr1 Pr3 Pr5 S1 S2
1 1 03/20/20 18 M 福州 69 11 20 88 67
2 2 03/21/20 25 F 厦门 57 14 34 78 87
3 3 03/22/20 26 F 泉州 67 34 35 NA 45
4 4 03/23/20 35 M 龙岩 65 23 56 56 25
5 5 03/24/20 48 F 漳州 72 35 47 45 NA
6 6 03/25/20 50 M 三明 55 12 19 60 96

解释

  • names()
  • %in% :用于提取两个向量中重合的部分,整体返回值为逻辑值
  • mydata[!newdata4]:!表示取反,也就是说返回除了“pr2”,”pr4”以外的值。

方法二

知道元素位置时

1
2
newdata6<-mydata[c(-7,-9)]
newdata6
1
2
3
4
5
6
7
  PatientID     Data Age Gender City Pr1 Pr3 Pr5 S1 S2
1 1 03/20/20 18 M 福州 69 11 20 88 67
2 2 03/21/20 25 F 厦门 57 14 34 78 87
3 3 03/22/20 26 F 泉州 67 34 35 NA 45
4 4 03/23/20 35 M 龙岩 65 23 56 56 25
5 5 03/24/20 48 F 漳州 72 35 47 45 NA
6 6 03/25/20 50 M 三明 55 12 19 60 96

方法三

1
2
mydata$Pr2<-mydata$Pr4<-NULL
mydata

选入观测

subset()函数

语法

1
subset(dataset , subset , select )

属性

  • dataset 是要进行操作的数据集
  • subset 是对数据的某些字段进行操作
  • select 选取要显示的字段

案例

选择mydata中的Age大于等于30或Age小于等于25的行,保留变量Pr1到Pr5

1
2
newdata9<-subset(mydata,Age>=35|Age<25,select=c(Pr1,Pr2,Pr3,Pr4,Pr5))
newdata9
1
2
3
4
5
  PatientID     Data Age Gender City Pr1 Pr3 Pr5 S1 S2
1 1 03/20/20 18 M 福州 69 11 20 88 67
4 4 03/23/20 35 M 龙岩 65 23 56 56 25
5 5 03/24/20 48 F 漳州 72 35 47 45 NA
6 6 03/25/20 50 M 三明 55 12 19 60 96

选60岁以上的男性,并保留变量Age到S1之间所有的列

1
2
3
  Gender City Pr1 Pr3 Pr5 S1
4 M 龙岩 65 23 56 56
6 M 三明 55 12 19 60

使用SQL语句操作数据框

1
2
install.packages("sqldf")
library(sqldf)

随机抽样

1
sample(x, size, replace = FALSE)

参数详解

  • x 整体数据,以向量形式给出
  • size 抽取样本的数目
  • replace 如果为F(默认),则是不重复抽样,此时size不能大于x的长度;
    如果为T,则是重复抽样,此时size允许大于x的长度

日期值

格 式 涵 义
%Y 年份,以四位数字表示,2007
%m 月份,以数字形式表示,从01到12
%d 月份中当的天数,从01到31
%b 月份,缩写,Feb
%B 月份,完整的月份名,指英文,February
%y 年份,以二位数字表示,07
…… ……

字符型转换为日期

1
as.Date() 

返回当天日期

1
Sys.Date()

返回当前日期和时间

1
date()

输出指定格式的日期值

1
format(x,format="output_format")

计算时间间隔

1
difftime()

将日期转换为字符型变量

1
as.character()

其它复杂操作

  • lubridate包、timeDate包等