查看原文
其他

R语言常用数据处理代码整理

段小麻 R语言统计与绘图 2023-01-01

在收集好临床数据,经过初步处理后,就可以导入到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、ALT4个变量,这4个变量显示为非因子型变量,需要快速转化为因子型变量。

vars <- c("sex","Hypten","CardInfa","ALT")  
# 选中需要转化为因子的变量
mytest[vars] <- lapply(mytest[vars],factor) 
# 使用lapply函数批量转化为因子

5. 列变量重命名

假设mytest数据框中有IDNAME两个变量,这两个变量分别位于第1列和第2列,需要将这两个变量名修改为idname

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 新列
R中支持的算术运算符

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列的数据
R中支持的运算符

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" })
R中支持的逻辑运算符

11.2 分类转为分类

假设mytest数据框中stage是个多分类变量,因子水平为poor、improved、excellent,要将其转换为二分类变量,poor分为1组,improvedexcellent分为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

文章推荐

PDF电子书怎么自动生成书签? 2020-05-17
疫情期间R语言学习推文汇总 2020-05-16


R语言统计与绘图

长按二维码识别关注

回复关键词有惊喜(长按复制)

"R语言实战","SPSS","prism"

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存