R语言常用数据处理代码整理
在收集好临床数据,经过初步处理后,就可以导入到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组。
stage1 <- c("poor","improved","excellent") # stage 的三个水平
newstage1 <- factor(c("poor","good","good")) # 跟上面一一对应,也是对应三个水平
mytest$newstage <- newstage1[ match(mytest$stage, stage1) ] # 转换
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),]
# 列出有一个或多个缺失值的行观测
End
文章推荐
R语言统计与绘图
长按二维码识别关注
回复关键词有惊喜(长按复制)
"R语言实战","SPSS","prism"