在收集好临床数据,经过初步处理后,就可以导入到R软件中去。
R在进行统计分析前,常常需要对数据进行处理,使数据结构符合我们的统计需要,比如说变量因子化、创建新变量、变量类型转化等等,因此数据处理是R进行统计分析前很重要的步骤。
现基于各类R语言入门书整理R中常见的数据处理代码。
目 录
- 1. 预览数据集
- 2. 查看数据集结构
- 3. 数据类型转化
- 4. 批量转化变量为因子型
- 5. 列变量重命名
- 6. 数据集增删列变量
- 6.1 创建新变量
- 6.2 剔除列变量
- 7. 数据集中列排序
- 8. 数据集中行排序
- 8.1 升序排列
- 8.2 降序排列
- 8.3 缺失值排序
- 9. 数据集中筛选子集
- 9.1 筛选行数据
- 9.2 筛选列变量
- 10. 修改因子水平
- 10.1 修改因子水平顺序
- 10.2 修改因子水平名称
- 11. 分类与连续变量转化
- 11.1 连续转为分类
- 11.2 分类转为分类
- 12. 长宽数据类型转化
- 12.1 宽数据转长数据
- 12.2 长数据转宽数据
- 13. 数据集合并
- 13.1 横向合并添加列
- 13.2 纵向合并添加行
- 14. 缺失值处理
- 14.1 重编码某些值为缺失值
- 14.2 在分析中排除缺失值
- End
1. 预览数据集
在导入数据后,常需要查看数据的基本信息。
head(mytest) # 查看数据集前6行
head(mytest,3) # 查看数据集前3行
tail(mytest) # 查看数据集后6行
# 这个函数可以用来查看数据集的行数
tail(mytest,5) # 查看数据集后5行
View(mytest) # 预览整个数据集
# mytest为数据框名称
2. 查看数据集结构
从外部读取数据后,建议查看数据结构和列名,以防读取出错。
通过str()函数可以看出数据集中包含多少观测对象、多少变量以及每个变量的类型等。
str(mytest) # 查看数据属性结构
names(mytest) # 输出数据框变量名称
# mytest为数据框名称
3. 数据类型转化
有些数据集中的变量为数值型、因子型、整数型等等,但是单从表面来看不能判断是何种类型的变量,可以使用相关代码来查看和转化变量类型。
# mytest为数据集名称,smoke为数据集中列变量
# 查看mytest数据集中smoke变量类型
class(mytest$smoke)
# 将mytest数据集中status变量转化为因子
as.factor(mytest$smoke)
# 查看mytest数据集中sex变量是否为字符型变量
is.character(mytest$sex)
4. 批量转化变量为因子型
假设mytest数据框中有sex、Hypten、CardInfa、ALT
4个变量,这4个变量显示为非因子型变量,需要快速转化为因子型变量。
vars <- c("sex","Hypten","CardInfa","ALT")
# 选中需要转化为因子的变量
mytest[vars] <- lapply(mytest[vars],factor)
# 使用lapply函数批量转化为因子
5. 列变量重命名
假设mytest数据框中有ID
和NAME
两个变量,这两个变量分别位于第1列和第2列,需要将这两个变量名修改为id
和name
。
names(mytest)[1:2] <- c("id","name")
# 将mytest数据框第1、2列变量名修改为"id","name"
names(mytest)
# 输出mytest的列变量名,查看是否修改成功
6. 数据集增删列变量
6.1 创建新变量
假设mytest数据框中有体重weight
和身高height
两个变量,我要增加体重指数BMI
这个变量。
使用transform()函数
options(digits=4) # 可以设定有效数字4位,也可以设置其他位数
mytest <- transform(mytest, BMI = (weight/((height/100)^2)))
# 创建BMI新变量,添加 BMI 新列

6.2 剔除列变量
在计算出BMI
变量后,可能体重weight
和身高height
这两个变量就不需要了,需要删除掉。
mytest <- subset(mytest, select = -weight)
# 在 weight 变量前加减号就可删除 weight 变量。
mytest <- subset(mytest, select = c(-weight, -height))
# 在weight和height变量前加减号就可以删除两个变量
7. 数据集中列排序
假设mytest数据框中有7个变量,现在需要调整这7个变量在数据框中的排列顺序。
mytest <- mytest[c(1,2,4,3,5,6,7]
# 把第4列变量调换到第3列变量前面
# 对于好几十列甚至上百列的数据框,我只调换其中两列,
# 其他列保持不动,怎么快速调换这两列顺序?
mytest <- mytest[c(1:4,7,6,5,8:12)]
# 第1-4列和第8-12列顺序保持不变,第5,6,7列变换位置
8. 数据集中行排序
在数据集中,列变量中常常会有缺失值,离群值等异常值,在进行数据可视化时,有时也需要按数据大小排序进行绘图。
这里就需要用到行排序,按升序、降序排列可以快速找到一列数值的极值。
8.1 升序排列
# mydata为数据集,x1、x2、x3为数据集中的变量
arrange(mydata, x1) # x1按升序排列
arrange(mydata, x1, x2)
# 先将x1变量升序排列,再将x2变量升序排列
8.2 降序排列
arrange(mydata, desc(x1)) # x1按降序排列
arrange(mydata, desc(x1), desc(x2)) # 先按x1降序排列,再按x2降序排列
arrange(mydata, desc(x1), x2) # 先按x1降序排列,再按x2升序排列
8.3 缺失值排序
使用arrange()函数进行排序,不管使用升序还是降序,缺失值总是排在最后面。
怎么把缺失值排前面了?
arrange(mydata, desc(is.na(x3)))
arrange(mydata, desc(is.na(x3)), x3)
9. 数据集中筛选子集
在数据处理过程中,有时只需要选取部分数据集进行研究,比如说只选取男性或者女性,可以设定筛选条件筛选需要的数据集进行分析。
9.1 筛选行数据
在mytest数据框中,只筛选男性患者进行研究;
# sex为分类变量,有F(女)、M(男)两个水平
test <- subset(mytest, sex == "M")
# 将筛选后的子集命名为 test
增加筛选条件,如筛选≥30岁的男性患者
test <- subset(mytest, sex == “M” & age >= 30)
# 将筛选后的子集命名为 test
9.2 筛选列变量
在≥30岁男性中只选取部分列数据进行研究
# 假设选取name, age, height, ckd这4列数据进行研究
test <- subset(mytest, sex == "M" & age >= 30,
select = c(name, age, height, ckd))
对于要选取很多列变量的,怎么快速选取?
test <- subset(mytest, sex == “M” & age >= 30,
select = c(1:4,6:10))
# 选取第1-4列和第6-10列的数据

10. 修改因子水平
10.1 修改因子水平顺序
假设在mytest数据框中,存在疾病分期stage
这个有序分类变量,正常顺序是:poor、improved、excellent
;
mytest$stage <- factor(mytest$stage,
levels = c("poor","improved","excellent"))
怎么颠倒已经改好了的因子顺序?比如说stage。
mytest$stage <- factor(mytest$stage,
levels = rev(levels(mytest$stage)))
# 使用函数rev(levels())
10.2 修改因子水平名称
在mytest数据框中,stage变量的水平名称为poor、improved、excellent
,现在改成较差、改善、较好
。
library(plyr) # 加载包,需要revalue函数
mytest$stage <- revalue(mytest$stage,
c("poor"="差", "improved"="改善", "excellent"="好"))
11. 分类与连续变量转化
11.1 连续转为分类
假设leadership数据框中有年龄age这个连续变量,需要重编码为分类变量,将>75岁分为老年,55-75分为中年,<55分为青年,缺失值仍编码为缺失值NA。
leadership <- within(leadership,{
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young" })

11.2 分类转为分类
假设mytest数据框中stage是个多分类变量,因子水平为poor、improved、excellent
,要将其转换为二分类变量,poor
分为1组,improved
和excellent
分为1组。
stage <- c("poor","improved","excellent") # stage 的三个水平
newstage <- factor(c("poor","good","good")) # 跟上面一一对应,也是对应三个水平
mytest$newstage <- newstage[match(mytest$stage, stage)] # 转换
head(mytest) # 查看转换结果
12. 长宽数据类型转化
12.1 宽数据转长数据
如下图所示,假设test数据集中有6个变量,其中有testA和testB两个变量,现将这两个变量转换为1个变量,并增加一列用来储存数值。

转换需要用到 reshape2 包中的 melt 函数。
library(reshape2) # 加载包
mytest <- melt(test, # 变量来源的数据集
id.vars = c(1:4), # 1-4列为保持不变的变量
measure.vars = c("testA","testB"), # 需要转换的变量
variable.name = "group", # 转换后的变量列名
value.name = "value") # 转换后的列的值
mytest # 查看转换效果

12.2 长数据转宽数据
从上面中我们将testA和testB这两个变量转换成了1个变量,怎么再转换回去,就是由长数据怎么转换成宽数据。
转换需要用到 reshape2 包中的 dcast 函数。
library(reshape2)
test1 <- dcast(data = mytest, # 数据源
formula = id + name + sex + age ~ group, # 前面为保持不变的列,后面需要转换列的变量
value.var = "value") # 需要转换的列的值
test1 #查看输出结果

13. 数据集合并
数据集合并有两种,一种横向合并,在数据集中横向添加列变量;还有一种纵向合并,是在数据集中纵向添加行数据。
13.1 横向合并添加列
要横向合并两个数据框,可以使用merge()函数。大多数情况下,两个数据框是通过一个或多个共有变量进行合并的。
# 一个共有变量
total <- merge(dataframeA, # 数据框A
dataframeB, # 数据框B
by="ID") # 两个数据集的共有变量ID
# 两个共有变量
total <- merge(dataframeA,
dataframeB,
by=c(“ID”,“Country”)) # 两个数据集的共有变量ID和Country
如果直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,那么可以使用cbind()函数。
total <- cbind(A, B)
这个函数将横向合并对象A和对象B。为了让它正常工作,每个对象必须拥有相同的行数,以同顺序排序。
13.2 纵向合并添加行
要纵向合并两个数据框,可以使用rbind()函数。
total <- rbind(dataframeA, dataframeB)
两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。如果dataframeA中拥有dataframeB中没有的变量,请在合并它们之前做以下某种处理:
-
删除dataframeA中的多余变量; -
在dataframeB中创建追加的变量并将其值设为NA(缺失)。
14. 缺失值处理
符号 | 解释 |
---|---|
NA | 缺失值 |
NaN | 不可能值 |
Inf和-Inf | 分别表示正无穷和负无穷 |
is.na() | 识别缺失值 |
is.nan() | 识别不可能值 |
is.infinite() | 识别无穷值 |
下面三个函数的返回结果都是TRUE或FALSE
。

14.1 重编码某些值为缺失值
可以使用赋值语句将某些值重编码为缺失值,
# leadership为数据集,age为数据集中的变量
leadership$age[leadership$age == 99] <- NA
# 数据集中任何等于99的年龄值都将被修改为NA。
14.2 在分析中排除缺失值
多数的数值函数都拥有一个na.rm=TRUE
选项,可以在计算之前移除缺失值并使用剩余值进行计算。
通过函数na.omit()
可以移除所有含有缺失数据的行。
newdata <- na.omit(leadership)
# 删除leadership数据集中含有缺失数据的行
函数complete.cases()
可以用来识别矩阵或数据框中没有缺失值的行。
# sleep为数据集名称
sleep[complete.cases(sleep),]
# 列出数据集中没有缺失值的行观测
sleep[!complete.cases(sleep),]
# 列出有一个或多个缺失值的行观测