2021.4.22
持续更新中。。。
《R语言实战2》、学术数据分析及可视化
1. 取子集
1.1 针对向量
set.seed(999)
df1 <- floor(runif(10, 1, 101))
#利用[]进行提取
df1[c(1:5)]
df1[which(df1 > 50)]
which()
返回向量中符合条件元素的位置信息。
1.2 针对数据集
pneumonia_data <- read.table('pneumonia_en.txt', header =T)
#利用"文件名称+$"提取数据框中某一列,或某一列中的某些元素
pneumonia_data$case
pneumonia_data$case[1:10]
#利用subset提取数据框中,符合某一条件的所有的内容
subset(pneumonia_data, increase > 1000, select = c(data, case))
subset()
按照某一列的条件取数据框子集后,可通过select
选项选择需要保留的其他列,默认全部保留。(支持负索引)
2. 直接生成新的数据集
2.1 生成随机抽样样本
-
sample()
:用于从数据集中(有放回或无放回)抽取大小为size的一个随机样本。例如:
sample(x, size, replace = FALSE)
-
runif()
:生成随机数,默认情况下是生成均匀分布的随机数。例如:
# 生成10个1-100之间的随机数,并保留一位小数
round(runif(10,min=1,max=100), digits=1)
-
rnorm
:生成正态分布的随机数
- 常用
set.seed(999)
来固定生成的随机数round(x,digits=n):
保留x的小数位数options(digits=n):
可以在最开始的位置,设置全局小数保留的位数
2.2 生成等差数列
# 生成from到to,等差为by的数列
seq(from, to, by)
重要参数:
- from:生成向量的起点
- to:生成向量的终点
- by:序列的增量,默认为1
- length.out:输出长度
2.3 重复生成
rep(x, times = a, each = c, length.out = d)
重要参数:
- x:可以是单个数字或向量
- times:整个数组循环几遍
- each:每个元素重复次数
- length.out:输出长度
3. 数据操作
3.1 行列操作
- 查看行名和列名
rownames(mtcars)
colnames(mtcars)
- 在矩阵后添加行/列
dfx <- c(1,3,10,16,33,70,150)
dfy <- c(5,5,18,20,45,90,200)
df <- data.frame(dfx, dfy)
#求每行的和
apply(df,1,sum)
#将求得的和追加到数据框df后面
df$sum1 <- apply(df, 1, sum)
#修改表头
rownames(df) <- c('dfx', 'dfy', 'rowsum')
- 给矩阵增加表头和列名
x <- matrix(1:12, nrow=3, byrow=T)
rownames(x) <- LETTERS[1:3] #大写字母ABC作为行名
colnames(x) <- c("x", "Y", "doc", "Bear") #列名填充
rownames(x) #查看行名
3.2 合并数据
#横向合并
total <- cbind(A, B)
#列向合并
total <- cbind(A, B)
3.3 行列转置
t(A)
3.4 将函数应用到矩阵或数据框
通过R对象的函数应用是针对所有元素进行的(例如:对矩阵直接用mean等函数是求矩阵所有元素总和的平均值),如果需要针对行/列进行处理,需要用到以下函数:
apply(x, margin, fun,..) # 对行或列进行函数fun的运算。
重要参数:
margin
:为1时表示行,为2时表示列。
3.5 长宽数据转换
重要概念:
- 二维数据集中,行表示观测,列表示变量。
- 宽数据:数据集对所有的变量进行了明确的细分,各变量的值不存在重复循环的情况也无法归类。表现为变量多而观察值少,即行少列多。
- 长数据:数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以归为几类)。表现为变量少而观察值多,即行多列少。
- 实验数据通常保存为宽数据,形如:
试验方式 | 重复1 | 重复2 | 重复3 |
---|---|---|---|
处理1 | 1.5 | 1.8 | 1.9 |
处理2 | 2.5 | 2.2 | 2.0 |
处理3 | 3.2 | 3.0 | 3.3 |
1.1 宽数据变长数据
library(gcookbook)
library(reshape2)
anthoming
melt(anthoming, id.vars = "angle", variable.name = "condition", value.name = "count")
reshape2包中的melt()函数
主要参数:
data:
需要转换的数据集id.vars:
不需要进行重新排列的列名,通常会随着melt不停重复堆叠,因此最好是无数学意义整数(变量位置信息)或字符串(名称信息)。若数据集不具备标识变量,可以在melt前使用data$ID <- rownames(data)
给数据框增加一列标识变量。variable.name:
melt 后观测变量的列名 ,填默认为 variablevalue.name:
melt 后观测值的列名, 默认为 value
1.2 长数据变宽数据
library(gcookbook)
library(reshape2)
plum
data <- dcast(plum, length + time ~ survival, value.var = "count")
#保存文件到本地
write.csv(data, file = "file_name")
reshape2包中的dcast()函数
主要参数:
data
:需要转换的数据集a ~ b
:波浪线左侧表示标识变量(留下来的列),右侧表示可变变量(会转换成新的列变量,就是那些重复的变量)。左右侧均可是多个变量。value.var
:相应的数值列。
1.3 一个更加方便的包和函数
install.packages("tidyr")
library(tidyr)
#宽数据转换为长数据
gather(Ndata, 重复, 生物量, -N)
#长格式转换成宽格式
spread(df1, 重复,生物量)
gather()
函数关键参数:
Ndata:
需要转换的宽数据名重复:
设置转换后会堆叠的变量名,一般就是将表头重复堆叠之后,给与这些堆叠的数据一个名称生物量:
设置新生成的观测值变量名,就是那些数值数据变形后的变量-N:
标识变量名,不变的列
gather()
函数关键参数:
df1:
需要转换的长数据名重复:
转换后会分散的变量名,一般转换后会形成表头生物量:
观测值变量名
4. 处理缺失值
-
df1<- na.omit(df):
删除含有NA的行 -
df[is.na(df)] <- 0:
用0替换NA - 通过趋势预测来插补缺失值(用平均值)
---情况一:剩余数值波动不大时,可用平均值填补---
df$rate[is.na(df$rate)] <- mean(df$rate, na.rm = T)
---情况二:存在波动时,利用函数关系进行插补---
---情况三:利用回归函数进行插补---
数据拟合不理想的解决思路:
- 选择其他模型进行重新拟合
- 重新选择部分数据进行拟合
网友评论