百日筑基篇——数据的读取与处理(R语言初识二)


文章目录

  • 前言
  • 一、数据的读取与写入
  • 二、数据处理
  • 1.数据清洗
  • 1.1 缺失值处理
  • 1.2 处理重复值
  • 1.3 异常值处理
  • 1.4 数据类型转换
  • 2.数据转换
  • 3.数据集成
  • 4.数据重塑
  • 总结



前言

作为一个生物专业的学生,对计算机编程语言有较多兴趣,在生信分析中,R语言的学习是必不可少的,作为一个萌新,希望以这种方式,对自己的学习不断进行复盘,同时希望多多指教!!


一、数据的读取与写入

read.csv():用于读取以逗号分隔的文本文件(.csv)

read.table():用于读取以制表符分隔的文本文件(.txt)或其他自定义分隔符的文件

read.xlsx():用于读取Excel文件(.xlsx)

read.table(file="",header=T,sep="",skip = ,nrows = ,na.strings = )	
read.csv(file="",header = T)
#用于读取文件
head()
tail()
read.table("clipboard",sep ="\t")	#直接读取剪切的内容
read.table(gzfile("....gz"))	#读取压缩文件
write.table(x,file = "D:/RBook/newfile.csv",sep=",",row.names = F,append = T)	#写入文件,数据追加
library(openxlsx)
read.xlsx("D:/RBook/newfile.xlsx",sheet = 1)	#读取Excel文件
wb <- createWorkbook()	#创建一个空的工作簿
addWorksheet(wb,sheetName = 1)	#添加工作表
x <- mtcars
writeData(wb,sheet = 1,x,startCol = 1,startRow = 1)	#writeData() 函数用于将数据对象 x 写入到工作簿的指定工作表中,并指定写入数据的起始列和行。
write.xlsx(x,"cars.xlsx")# 写入新的Excel文件

二、数据处理

数据处理是指对原始数据进行清洗、转换、集成和重塑等操作,以便于后续的分析和建模。目的是提高数据的质量、准确性和可用性,并使数据适合于各种分析方法和应用场景。

1.数据清洗

数据清洗是数据处理中的一个重要步骤,用于检测、纠正和删除原始数据中的错误、缺失值、重复值和异常值等问题,以提高数据的质量和准确性。下面是一些常见的数据清洗操作:

1.1 缺失值处理

检测缺失值:使用is.na()函数检测数据中的缺失值。
填充缺失值:使用na.fill()函数或其他填充方法填充缺失值,如使用平均值、中位数或众数进行填充。
删除缺失值:使用na.omit()函数删除包含缺失值的行或列。
缺失值统计和处理:
sum(is.na()):统计数据中的缺失值数量。
mean()、median()、sum() 等:在计算统计量时忽略缺失值,可以使用 na.rm = TRUE 参数。

library(VIM)
sleep  #一个包含缺失值的数据集,来自VIM包
is.na(sleep)
table(is.na(sleep))
nrow(sleep)
length((rownames(na.omit(sleep))))
rownames(sleep)
na.omit(sleep)	#直接删除缺失的行或列
sum(sleep$Sleep,na.rm=T)
colSums(sleep)
table(is.na(sleep[2,]))

library(zoo)
x <- c(1, 2, NA, 4, 5, NA)
y <- c(2,NA,5,8,9,5)
x <- cbind(x,y)
# 使用na.fill()函数将缺失值填充为指定的值
filled_x <- na.fill(x,0)
x[is.na(x)] <- 0 	#根据索引将缺失值填充为0

1.2 处理重复值

检测重复值:
duplicated()函数:使用该函数可以检测出数据中的重复行。它返回一个逻辑向量,表示每一行是否为重复行。

删除重复值:
unique()函数:该函数能够删除向量或数据框中的重复行,并返回一个不含重复行的新数据对象。
duplicated()函数与逻辑索引:通过与逻辑索引的结合使用,可以将重复行在数据框中标记出来,并进行删除。

过滤重复值:
subset()函数:使用subset()函数结合duplicated()函数,可以根据某一列的重复情况,选择保留或删除特定的重复行。

处理特定列的重复值:
group_by()函数与distinct()函数:根据某一列或多列的组合,使用group_by()函数分组后,再结合distinct()函数,可以识别和删除特定列中的重复值。

x <- cbind(c(2,3,4,1,1),c(2,2,4,1,1))
duplicated(x) %>% table()	#检测重复值

y <- x[!duplicated(x),]	#删除重复值
y <- unique(x)

filtered_data <- subset(x, !duplicated(x),select = 1:3)  #过滤重复值

library(dplyr)
filtered_data <- distinct(iris, Species, .keep_all = TRUE)	#返回一个新的数据框,其中不包含特定列中有重复值的观测数据
data <- data.frame(
  id = c(1, 2, 3, 2, 4),
  name = c("John", "Jane", "Bob", "Jane", "Alice")
)
# 使用group_by()函数和distinct()函数处理特定列重复值
filtered_data <- data %>% group_by(name) %>% distinct()

1.3 异常值处理

检测异常值:使用离群值检测方法,如箱线图、Z分数等,识别可能存在的异常值。

处理异常值:可以删除异常值、替换为合理的值或将其设置为缺失值。

#创建示例数据
data <- c(10, 20, 30, 40, 200, 50, 60, 70)

# 绘制箱线图
boxplot(data)

# 检测异常值
outliers <- boxplot.stats(data)$out

# 替换异常值
data_no_outliers <- ifelse(data %in% outliers, median(data), data)

# 输出结果
print(data_no_outliers)

1.4 数据类型转换

确认和调整数据类型:使用函数如as.numeric()、as.character()等将数据转换为正确的数据类型,确保数据的一致性和准确性。

2.数据转换

数据转换是数据预处理的一个重要步骤,它旨在改变原始数据的形式或结构,以便提高数据的可用性、可解释性或适应特定的分析任务。
常见的数据转换方法包括:

1.对数转换:对数据应用对数函数,用于降低数据的偏态分布或缩小较大值的范围。

2.平方根转换:对数据应用平方根函数,用于减小数据的离散度或压缩较大值的范围。

3.指数转换:对数据应用指数函数,用于增加数据的离散度或带宽。

4.Box-Cox变换:一种统计学方法,用于对数据进行幂函数转换,可使数据的分布更接近正态分布。

5.二值化:根据给定的阈值将数据转换为二进制形式,适用于某些特定的分类任务或规则构建。

6.独热编码:将分类变量转换为二进制向量的形式,以便于应用于机器学习算法中。

7.特征降维:通过主成分分析(PCA)、线性判别分析(LDA)等方法,将高维数据转换为低维表示,以便于可视化或建模分析。

8.日期和时间转换:对日期和时间变量进行格式化、提取或计算。这涉及到转换日期和时间的格式、提取特定的日期时间成分(年份、月份、小时等),或计算日期和时间之间的差值。

9.数据归一化:目的是将具有不同量纲和范围的数据转换为统一的标准,以便于比较和分析。以下是两种常见方法:

最小-最大缩放方法:对每个数据点,使用以下公式进行缩放:(x - min) / (max - min),其中x是数据点的原始值
标准化方法:将数据转换为具有均值为0、方差为1的标准正态分布 。可以使用以下公式进行计算:(x - mean(x)) / sd(x)

# 创建示例数据
data <- data.frame(
  x1 = c(10, 20, 30, 40, 50),
  x2 = c(5, 15, 25, 35, 45)
)

# 使用scale()函数进行标准化
standardized_data <- scale(data,center = TRUE ,scale = TRUE)

# 最小-最大缩放方法
scaled_data <- (data - min(data)) / (max(data) - min(data))

# 输出结果
print(standardized_data) ; print(scaled_data)

选择适当的数据转换方法应根据具体问题和数据的特征来决定。在应用转换方法之前,应该对数据进行初步分析和了解,了解数据的分布、缺失值情况、异常值等特征,以及考虑所选方法对数据的影响。

3.数据集成

数据集成是指将来自不同来源和不同格式的数据整合到一个统一的数据存储中,以便于综合分析、挖掘和应用
在数据集成中,可以采取以下方法来实现数据集成的目标:

合并(Merging):使用共同的变量或键将多个数据集进行匹配和连接。

转换(Reshaping):将数据从一种结构转换为另一种结构。例如,将宽格式的数据转换为长格式,其中每个变量都成为一个观测值的一部分,或将长格式的数据转换为宽格式,其中每个观测值都成为一个变量。

划分(Partitioning):将数据集划分为不同的子集,如训练集、验证集和测试集等。这可以用于机器学习模型的开发和评估,其中训练集用于模型训练,验证集用于模型参数调优,测试集用于模型性能评估。

#合并
xx <- data.frame(k1=c(NA,NA,3,4,5),k2=c(1,NA,NA,4,5),data=1:5)
xy <- data.frame(k1=c(NA,2,NA,4,5),k2=c(NA,NA,3,4,5),data=1:5)
merge(xx,xy,by="k1")#以k1作为共有变量合并
merge(xx,xy,by="k1",incomparables = NA)#排除有NA 的情况

#转换
library(reshape2)
head(airquality)
names(airquality) <- tolower(names(airquality))
air <- melt(airquality,id.vars  = c("month","day"))	#id参数告诉哪一行或那一列做观测,剩余数据为观测值
dcast(air,month+day~variable)	#对air进行数据的重构,于melt函数相对
AIR <- dcast(air,day~ variable,mean,na.rm=TRUE)	#对day求均值

library(tidyr)
tdata <- mtcars[1:10,1:3]
tdata <- data.frame(names=rownames(tdata),tdata)
tdata <- gather(tdata,key="KEY",value = "VALUE",2:4)	#将宽格式的数据转换为长格式
spread(tdata,key="KEY",value = "VALUE")	#将长格式的数据转换为宽格式


#划分
# 假设原始数据集为df,其中包含输入特征X和对应的目标变量Y
set.seed(123)  
# 随机划分数据集,70%作为训练集,20%作为验证集,10%作为测试集
train_index <- sample(1:nrow(df), round(0.7*nrow(df)), replace = FALSE)
validation_index <- sample(setdiff(1:nrow(df), train_index), round(0.2*nrow(df)), replace = FALSE)
test_index <- setdiff(setdiff(1:nrow(df), train_index), validation_index)

# 划分数据集为训练集、验证集和测试集
train_set <- df[train_index, ]
validation_set <- df[validation_index, ]
test_set <- df[test_index, ]

4.数据重塑

数据重塑是一种对数据进行重新组织和转换的操作,以满足特定的分析和可视化需求。在数据重塑过程中,可以采取以下几种常见的操作:

汇总和聚合(Aggregation):对数据进行汇总和计算统计量,如计算平均值、求和、计数等。这可以帮助我们了解数据的总体特征和趋势,以及进行数据分析和预测。

透视表和交叉表(Pivoting and Crosstab):使用透视表和交叉表将数据从行和列的布局转换为以某些变量为轴的表格。透视表可以展示变量之间的相互关系和交叉情况,有助于分析和可视化数据。

数据透视(Pivoting):通过将数据的行转换为列,将数据从长格式转换为宽格式,以方便进行分析和可视化。这常用于时间序列数据或实验数据的处理,例如将每个时间点的观测值转换为每列一个时间点的数据。

数据堆叠(Stacking):将数据在垂直方向上进行堆叠,将多个列或变量堆叠在一起,从而产生更长的数据集。这可以用于将多个观测结果或变量组合在一起进行分析或建模。


总结

今天,整理了数据的读取与处理,引入数据进行处理,在对数据进行分析得到数据模型前,数据的预处理是十分重要的,保证了模型的正确性与精确度。对数据的处理并不是一成不变的,这要求对特定数据进行特定分析。OK,今天的总结到此为止。
鱼在水中游,是尾也是头