R语言中的探索性数据分析与子集选择
立即解锁
发布时间: 2025-09-02 01:51:37 阅读量: 8 订阅数: 12 AIGC 

### R语言中的探索性数据分析与子集选择
在数据分析领域,R语言是一种功能强大且广泛使用的工具。本文将详细介绍R语言中探索数据集和进行子集选择的相关知识,包括基本函数的使用、常见运算符的含义以及多种子集选择方法。
#### 1. 探索数据集的基本函数
当我们将数据集文件导入到R语言的四窗格工作区的左上角窗格后,就需要对数据集进行一些基本的探索。以下是一些常用的函数:
- **dim( )**:用于查看数据集的维度,即行数和列数。例如,对于数据集`MMstat`,可以使用以下代码:
```R
dim (MMstat)
```
运行结果可能如下:
```
[1] 500 18
```
这表示`MMstat`数据集有500行和18列。
- **names( )**:返回数据集中变量的名称。示例代码如下:
```R
names(MMstat)
```
输出结果会列出从第1列到第18列的变量名称,例如:
```
[1] "ID" "Age" "Male" "Weight"
[5] "Height" "Diabetes" "COPD" "LVEF"
[9] "Creatinine" "Aspirin" "Broccoli" "CPB"
[13] "CC" "LOS" "Mortality" "Bleeding"
[17] "FUmortality" "FUtime"
```
- **ls( )**:按字母顺序列出数据集中变量的名称。代码如下:
```R
ls(MMstat) #list alphabetic order
```
输出结果如下:
```
[1] "Age" "Aspirin" "Bleeding" "Broccoli"
[5] "CC" "COPD" "CPB" "Creatinine"
[9] "Diabetes" "FUmortality" "FUtime" "Height"
[13] "ID" "LOS" "LVEF" "Male"
[17] "Mortality" "Weight"
```
- **head( )和tail( )**:分别用于查看数据集的前六行和后六行。
- **str( )**:可以快速查看数据集的内部结构,包括观测值的数量、观测值的类别以及可能存在的级别。示例代码如下:
```R
str(MMstat)
```
这个函数还可以帮助我们发现数据集中可能存在的缺失值和变量编码错误。例如,在`Male`变量中,用1或0来标识受试者的性别,这会导致R将其编码为数值变量。
以下是这些函数的总结表格:
| 函数 | 功能 |
| ---- | ---- |
| dim( ) | 概述数据集的维度(即行数和列数) |
| names( ) | 按列顺序列出数据集中变量的名称 |
| ls( ) | 按字母顺序列出数据集中变量的名称 |
| head( ) | 列出数据集中的前六个变量 |
| tail( ) | 列出数据集中的后六个变量 |
| str( ) | 展示数据集的结构,包括变量的类别(即数值/非数值) |
#### 2. 子集选择的概念与方法
在R语言中,子集选择是指从数据集中获取一部分数据的操作。这可以用于提取特定条件下的数据,例如只提取术前饮食中包含西兰花的个体的数据,或者进行多重子集选择,如提取术前饮食包含西兰花、男性且年龄超过60岁的患者的数据。
为了进行子集选择,我们使用`[]`运算符。可以通过以下步骤创建两个单独的子集:
1. 创建一个包含术前饮食包含西兰花的个体的所有数据的子集。
2. 创建一个包含术前饮食不包含西兰花的个体的所有数据的子集。
在R语言中,我们可以使用基础R中的基本内置函数(基本子集选择),或者使用R包`tidyverse`中的`dplyr`包进行更高级的子集选择。
#### 3. 使用基础R进行子集选择
以下是使用基础R进行子集选择的示例代码:
```R
broccoli<-MMstat[MMstat$Broccoli=='y',]
nobroccoli<-MMstat[MMstat$Broccoli=='n',]
```
在第一行代码中,我们将`MMstat`数据集中术前饮食包含西兰花(`Broccoli=='y'`)的患者的所有信息赋值给新对象`broccoli`。`[]`运算符对于子集选择至关重要,它跟在感兴趣的数据集后面,指定要从数据集中子集选择的变量。
这里涉及到几个重要的运算符:
- **$(美元符号)运算符**:用于从特定数据集中检索特定变量。例如,`MMstat$Broccoli`会返回`MMstat`数据集中`Broccoli`变量的所有信息。
- **==运算符**:是一个布尔运算符,用于在有两个可能值(通常为真或假)时整理数据。例如,`MMstat$Broccoli=='y'`会整理出`MMstat`数据集中所有术前饮食包含西兰花的患者的“真”数据。
- **逗号的作用**:在代码的末尾,逗号用于指定要包含的数据集中的列。如果逗号后面不输入任何数字,则表示选择所有列;如果输入数字,则只检索该列的数据。
以下是R语言中常见运算符的总结表格:
| 运算符 | 含义 |
| ---- | ---- |
|? | 帮助运算符,与函数结合使用,如`?mean`,在R的四窗格工作区的右下角窗格中显示帮助菜单 |
| <- | 将其右侧的值赋给左侧的对象,如`broccoli<-MMstat`,将`MMstat`赋值给`broccoli`对象 |
| $ | 从特定数据集中检索特定变量,如`MMstat$Broccoli`从`MMstat`数据集中提取`Broccoli`变量 |
| ‘ ’ | 单引号内的任何信息将被转换为文字,R将只搜索该确切字符或字符序列 |
| # | 用于注释,告诉R忽略`#`后面的所有字符并继续下一行,不影响R运行下一行的能力 |
| c() | “c”代表连接,将括号内的内容(数值和非数值)组合成一个向量 |
| + | 也是一种连接形式,用于编写多行长脚本,使R将其视为一个单一命令,而不是将每一行解释为一个新命令 |
| == | 布尔运算符,用于在有两个可能值时整理数据,通常为真或假,如`MMstat$Broccoli=='y'`整理出所有术前饮食包含西兰花的患者的数据 |
通过上述代码,我们将`MMstat`数据集拆分为两个单独的组:`broccoli`组包含术前饮食包含西兰花的受试者的所有信息,`nobroccoli`组包含术前饮食不包含西兰花的受试者的所有信息。
为了探索这两组之间基于平均年龄的差异,我们可以使用`summary( )`函数:
```R
summary(broccoli$Age)
summary(nobroccoli$Age)
```
运行结果可能如下:
```
Min. 1st Qu. Median Mean 3rd Qu. Max.
19.00 57.50 66.00 63.83 72.50 86.00
Min. 1st Qu. Median Mean 3rd Qu. Max.
14.00 54.00 65.00 62.82 73.00 86.00
```
从这些结果可以看出,两组的平均年龄相似。
我们还可以使用箱线图来直观地比较两组的年龄分布:
```R
boxplot(broccoli$Age, nobroccoli$Age,col=c('red', 'blue'), xaxt='n', main='Age y/o in the two groups')
axis(1, at=1:2, labels=c('Broccoli','noBroccoli'))
```
通过箱线图,我们可以看到两组的中位数(箱线图内的黑线)相似,但组间存在一些变异性差异,并且`Broccoli`组有更多的离群值。
#### 4. 更多基本子集选择的示例
以下是一些更有趣的基本子集选择示例:
- **计算数据集中年龄超过50岁的个体数量**:
```R
Ageover50<-MMstat$Age[MMstat$Age>50]
length(Ageover50)
```
- **获取年龄超过或等于50岁的患者的数据集**:
```R
Ageover50<-MMstat[MMstat$Age>=50,]
View(Ageover50)
```
- **提取年龄超过50岁、术前饮食包含西兰花且正在服用阿司匹林的患者的子集**:
```R
Ageover50<-MMstat[MMstat$Age>50 & MMstat$Broccoli=='y' & MMstat$Aspirin=='1',]
View(Ageover50)
```
- **绘制年龄超过或等于50岁且正在服用阿司匹林的`Broccoli`组和`noBroccoli`组个体的平均年龄箱线图**:
```R
Ageover50broccoli<-MMstat[MMstat$Age>=50 & MMstat$Broccoli=='y' & MMstat$Aspirin=='1',]
Ageover50nobroccoli<-MMstat[MMstat$Age>=50 & MMstat$Broccoli=='n' & MMstat$Aspirin=='1',]
boxplot(Ageover50broccoli$Age, Ageover50nobroccoli$Age, col=c('red', 'blue'), boxwex=0.4, ylim=c(50,100), ylab='years old', main= 'Patients over 50 with Aspirin')
axis(1, at=1:2, labels=c('Broccoli','noBroccoli'))
```
- **提取术前饮食包含西兰花且年龄在80到85岁之间的患者的数据**:
```R
broccoli<-MMstat[MMstat$Broccoli=='y' & MMstat$Age>='80' & MMstat$Age<='85',]
```
#### 5. 附加函数和将数据集存储为Tibble
- **attach( )函数**:当我们在编写较长的代码时,为了避免每次都输入数据集的名称,可以使用`attach( )`函数将数据集附加一次。例如:
```R
mean(MMstat$Age)
attach(MMstat)
mean(Age)
```
在附加数据集后,R将继续从附加的数据集中提取数据,直到收到其他命令。
- **将数据集存储为Tibble**:为了使用`dplyr`(`tidyverse`R包的一部分)作为子集选择工具,我们需要先将数据集存储为Tibble。示例代码如下:
```R
mmsubset<-as_tibble(MMstat)
```
子集选择是数据分析中的一个重要环节,它可以帮助我们深入探索数据集,进行描述性分析和推断统计。通过使用R语言中的各种函数和运算符,我们可以轻松地进行基本和高级的子集选择。
#### 6. 常用的子集选择函数
在R语言中,有一些常用的子集选择函数,下面将详细介绍它们的使用方法。
##### 6.1 filter( )函数
`filter( )`函数用于按行过滤数据。例如,我们可以创建一个只包含`Broccoli == 'y'`受试者的数据集块:
```R
broccolidpl<-filter(mmsubset, Broccoli=='y')
```
我们还可以创建更复杂的子集,如选择包含西兰花且没有慢性阻塞性肺疾病(COPD)的患者,或者年龄大于等于80岁的个体:
```R
broccolidpl<-filter(mmsubset, Broccoli=='y', COPD=='0')
broccolidpl<-filter(mmsubset, Age>='80')
```
当变量有两个以上的级别时,我们可以使用索引运算符`%in%`或管道运算符`|`。例如,对于`Diabetes`变量:
```R
broccolidpl<-filter(mmsubset, Diabetes %in% c('1', '2'))
broccolidpl<-filter(mmsubset, Diabetes=='1' | Diabetes=='0')
```
在进行子集选择后,可以使用`view( )`函数可视化结果:
```R
view(broccolidpl)
```
##### 6.2 select( )函数
`select( )`函数用于按列过滤数据。以下是一些使用示例:
```R
# 选择包含Diabetes和Broccoli的列
broccolidpl<-dplyr::select(mmsubset, Diabetes, Broccoli)
# 选择从ID到Broccoli的列
broccolidpl<-dplyr::select(mmsubset, ID:Broccoli)
# 选择以‘Bro’开头的列
broccolidpl<-dplyr::select(mmsubset, starts_with('Bro'))
```
##### 6.3 filter( )和select( )函数的组合使用
可以将`filter( )`和`select( )`函数组合使用,例如:
```R
broccolidpl<-filter(dplyr::select(mmsubset, Broccoli, Age), Age > 80)
head(broccolidpl)
```
这也可以通过管道运算符`%>%`实现:
```R
broccolidpl<-mmsubset %>%
dplyr::select(Broccoli, Age) %>%
filter(Age>80)
```
##### 6.4 arrange( )函数
`arrange( )`函数用于对数据集进行排序。例如,按年龄升序排序:
```R
broccolidpl<-mmsubset %>%
dplyr::select(Broccoli, Age) %>%
arrange(asc=Age)
View(broccolidpl)
```
##### 6.5 mutate( )函数
`mutate( )`函数用于向数据集中添加新的列和变量。在心脏手术中,有两个手术阶段,分别用`CPB`(心肺转流时间)和`CC`(交叉钳夹或缺血时间)表示。我们可以使用`mutate( )`函数计算两者的差值:
```R
broccolidpl<-mmsubset %>%
dplyr::select(Broccoli, Age, CC, CPB) %>%
mutate(ONBH=CPB-CC)
View(broccolidpl)
```
##### 6.6 summarise( )函数
`summarise( )`函数用于将变量缩减为值。例如,我们可以计算`Broccoli == 'y'`和`Broccoli == 'n'`两组的平均出血情况:
```R
broccolidpl<-mmsubset %>%
group_by(Broccoli) %>%
summarise(Averagebleeding=mean(Bleeding, na.rm=T))
View(broccolidpl)
```
如果想查看标准差,可以将`mean`替换为`sd`:
```R
broccolidpl<-mmsubset %>%
group_by(Broccoli) %>%
summarise(Averagebleeding=sd(Bleeding, na.rm=T))
```
##### 6.7 summarise_each( )函数
`summarise_each( )`函数可以在其他函数之后使用。例如,我们可以先按年龄分组,然后使用`summarise_each( )`函数计算平均出血和CPB时间,或者出血的最小值和最大值:
```R
broccolidpl<-mmsubset %>%
group_by(Age) %>%
summarise_each(mean, Bleeding, CPB)
broccolidpl<-mmsubset %>%
group_by(Age) %>%
summarise_each(funs(min(.,na.rm=TRUE), max(., na.rm=TRUE)), matches('Bleeding'))
```
##### 6.8 tally( )函数
`tally( )`函数用于统计分组后的数量。例如,按年龄和西兰花摄入情况分组并统计数量:
```R
broccolidpl<-mmsubset %>%
group_by(Age, Broccoli) %>%
tally(sort=TRUE)
View(broccolidpl)
```
以下是这些常用子集选择函数的总结表格:
| 函数 | 功能 |
| ---- | ---- |
| filter( ) | 按行过滤数据 |
| select( ) | 按列过滤数据 |
| arrange( ) | 对数据集进行排序 |
| mutate( ) | 向数据集中添加新的列和变量 |
| summarise( ) | 将变量缩减为值 |
| summarise_each( ) | 在其他函数之后使用,进行更复杂的统计计算 |
| tally( ) | 统计分组后的数量 |
通过使用这些函数,我们可以更高效地进行数据集的子集选择和分析。在实际应用中,可以根据具体需求灵活组合这些函数,以满足不同的数据分析任务。
综上所述,R语言提供了丰富的工具和函数来进行数据集的探索和子集选择。无论是基础的函数和运算符,还是高级的`dplyr`包中的函数,都能帮助我们深入挖掘数据,发现数据中的潜在信息。希望本文能对大家在R语言中进行数据分析有所帮助。
### R语言中的探索性数据分析与子集选择
#### 7. 子集选择的流程图示例
为了更清晰地展示子集选择的过程,我们可以使用mermaid格式的流程图。以下是一个简单的流程图示例,展示了如何使用`filter( )`和`select( )`函数进行子集选择:
```mermaid
graph LR
A[原始数据集mmsubset] --> B[select( )选择列]
B --> C[filter( )按行过滤]
C --> D[得到子集broccolidpl]
```
这个流程图展示了一个基本的子集选择流程:首先使用`select( )`函数选择需要的列,然后使用`filter( )`函数按行过滤数据,最终得到所需的子集。
#### 8. 子集选择的实际应用场景
子集选择在实际的数据分析中有很多应用场景,以下是一些常见的例子:
- **数据清洗**:在处理大型数据集时,我们可能只对某些特定条件下的数据感兴趣。通过子集选择,我们可以提取出这些数据,去除不需要的信息,从而简化数据集,提高分析效率。
- **特征工程**:在机器学习和数据挖掘中,我们通常需要从原始数据中提取出有意义的特征。子集选择可以帮助我们选择与目标变量相关的特征,从而提高模型的性能。
- **分组分析**:在进行统计分析时,我们可能需要将数据按照不同的类别进行分组,然后对每个组进行单独的分析。子集选择可以帮助我们轻松地实现数据的分组。
#### 9. 子集选择的注意事项
在进行子集选择时,需要注意以下几点:
- **变量名称的大小写**:在R语言中,变量名称是区分大小写的。因此,在使用变量名称进行子集选择时,必须确保变量名称的大小写与数据集中的一致,否则会导致错误。
- **数据类型的匹配**:在使用比较运算符(如`==`、`>`等)进行子集选择时,需要确保数据类型的匹配。例如,如果一个变量是字符型,那么在进行比较时,必须使用引号将值括起来。
- **缺失值的处理**:在进行子集选择时,需要考虑数据集中可能存在的缺失值。一些函数(如`mean( )`、`sd( )`等)在计算时会忽略缺失值,但有些函数可能会受到缺失值的影响。因此,在进行分析之前,需要对缺失值进行适当的处理。
#### 10. 总结与展望
本文详细介绍了R语言中探索数据集和进行子集选择的相关知识,包括基本函数的使用、常见运算符的含义、多种子集选择方法以及常用的子集选择函数。通过使用这些工具和方法,我们可以更深入地探索数据集,进行描述性分析和推断统计。
在未来的数据分析工作中,子集选择将继续发挥重要的作用。随着数据量的不断增加和数据分析需求的不断提高,我们需要更加高效和灵活的子集选择方法。同时,我们也可以结合其他数据分析技术,如机器学习、深度学习等,进一步挖掘数据的价值。
希望本文能够帮助读者更好地掌握R语言中的子集选择技术,在实际的数据分析工作中取得更好的效果。如果你对本文内容有任何疑问或建议,欢迎留言讨论。
以下是一个总结表格,回顾本文介绍的主要内容:
| 类别 | 具体内容 |
| ---- | ---- |
| 探索数据集的基本函数 | dim( )、names( )、ls( )、head( )、tail( )、str( ) |
| 子集选择的运算符 | []、$、==、&、%in%、| 等 |
| 基础R子集选择示例 | 创建包含和不包含西兰花的子集,计算年龄超过50岁的个体数量等 |
| 常用子集选择函数 | filter( )、select( )、arrange( )、mutate( )、summarise( )、summarise_each( )、tally( ) |
| 注意事项 | 变量名称大小写、数据类型匹配、缺失值处理 |
通过掌握这些内容,你可以在R语言中更加熟练地进行数据集的探索和子集选择,为数据分析工作打下坚实的基础。
0
0
复制全文
相关推荐









