运用R语言进行数据处理。
数据导入、数据结构、数据格式、数值处理、表格处理、日期处理、数字处理、缺失值与唯一值;
数据导入
- 要导入的数据必须存放在getwd()目录下
- Windows下路径要用斜杠
/
或者双反斜杠\\
read_csv("filename.csv", col_names=c(), col_types=col( colname=col_ ))
## read_csv导入 读取分隔符为逗号
## read_tsv导入 读取分隔符为制表符
## read_csv2导入 读取分隔符为分号
library(readr)
data <- read_csv("filename.csv")
library(dplyr)
data <- tbl_df(data) # 将表格转化为tbl_df的格式
View(data) # 视图形式查看
# 设置列名 col_names = TRUE/FASLE/c("name1","name2") # 第一行作为列名/不作为列名/重命名[数量必须相同]
# 排除某个列、变更列的格式 col_types = cols( X6=col_skip(),X1=col_character() ) # 不选中X6列 (X6为列名)
# 设置编码 locale = locale(encoding = "UTF-8")
## read.table导入
data <- read.table("filename.csv", header=TRUE,sep="",na.strings=c("x"))
# header=T,即将第一行作为列名;默认为FASLE;
# sep="",分隔符;默认为(空格、换行、回车、制表符),可设置为逗号(,)、制表符(\t)
# na.strings=c("x","y") 将等号之后的内容会被转换成NA;即该表中x/y的值会被转化为NA
## 直接用RStudio导入
分别设置第一行为列名、更改列名、列格式、跳过列
--
## 加载包中的数据
data(filename, package="") # 装在包中的特定数据
## 列出当前已加载包中所含的所有可用示例数据集
data() / data(package="")
数据结构
数据整体结构
## 返回数据结构
str(object)
## 返回数据结构/统计摘要
summary()
# 区别对待不同类型的数据变量- (1)数值型:相关极值等信息;(2)名义型/有序型:显示的是各水平的【频数值】
## 返回对象格式/类型
class() # 返回 numeric / character / factor / ts …
## 返回对象维度
dim()
## 返回对象模式
mode()
行列名称&重命名
## 返回所有列的名称
names(object)
colnames(object)
## 返回所有行的名称
row.names(object)
rownames(object) --二维以上的任何对象
--
## 重命名列名
library(dplyr)
rename(data, newname=oldname) # 新的列名在前
## 选择变量时进行重命名
select(data, oldname = newname) # 新的列名在后
长宽格式转换
## 转为长格式形式
library(reshape2)
new <- melt(data, id="var", measure="var")
# id="var"/ c("var1","var2") 以该变量为基准进行重构
# measure="var"/ c("var1","var2") 需要将哪些变量组合进id列的变量;若measure缺失,表示所有字段
`new <- melt(economics, id="data", measure=c("unemploy","uempmed")`
## 重铸为宽格式[excel统计表单的形式]
new <- dcast(data, formula, FUN)
# formula,rowvar1+rowvar2 ~ colvar1+colvar2的格式; rowvar-以此为基准的id列;colvar-需要重构的变量列
# FUN,按照任意函数来重构
`dcast(data, ID~variable, mean)`
数据行数、唯一值数
## 返回总行数/列数
ncol() / nrow()
length - 计算元素的长度
## 返回对象的个数 或者 某个列的的观测值行数
length(object/data$col)
# 返回对象的唯一值的行数
length(unique(data$col/object))
# 返回非空置的行数
length(na.omit(object/data$col))
数据格式
因子化
## 简单因子化
data$col <- factor(data$col)
## 有序因子化:按当前顺序来指定顺序
data$col <- factor(data$col, order=TRUE, levels=data$col)
## 有序因子化:自定义顺序
data$col <- factor(data$col, order=TRUE, levels=c("col1","col2"))
## 简单无序
data$col <- factor(data$col, order=FALSE)
## 无序因子化/名义变量
data$col <- factor(data$col, levels=c("col1","col2"), labels=levels / c("new_col1","new_col2"))
factor与as.factor的区别
as.factor(x) -- 只能对整个数据/列进行转换,其中无法插入其他语法
## 根据第二列的值,重新对第一列的值进行排序
data$col <- reorder(data$col,data$col2,[FUN],[order=T/F])
# FUN,表示对第二列进行的变换,以此为排序依据
# order= T/F ,逻辑值,返回一个有序因子 or 一个因素
数据格式索引
格式判断 | 格式转换 | 含义 |
---|---|---|
is.numeric( ) | as.numeric( ) | 数值格式 |
is.integer( ) | as.integer( ) | 整数 |
is.character( ) | as.character( ) | 字符串格式 |
is.factor( ) | as.factor( ) | 因子化 |
is.logical( ) | as.logical( ) | 逻辑值 |
as.Date(object, "format") | 日期格式 | |
is.list( ) | as.list( ) | 列表 |
is.data.frame( ) | as.data.frame | 数据框格式 |
is.matrix( ) | as.matrix( ) | 矩阵格式 |
is.array( ) | as.array( ) | 数据组 |
is.vector( ) | as.vector( ) | 向量格式 |
double:数值型格式(双精度向量:保存更多的有效位数)
有效位数&小数位数
## options() 有效位数
options(digits=n) # 限定最小值的有效位数,并使其他数字舍入后与其小数点后的位数相同;
--xx<-c(98,263.5, 2.43, 1.5531)
--options(digits=2) [1]98 263.6 2.4 1.6
绑定数据框
## with绑定数据框
<- with(data, {
stats <- summary(mpg)
})
# 花括号{}之间的语句都对数据框table执行,赋值仅在此函数的括号内生效;若使用<<则为全局变量
# 若在with符号左侧(new<-with())出现赋值的对象,则在with符号内产生的赋值依然在其外有效
# attach() / detach() # 必须成对出现
attach(data)
...
detach(...)
数值相关
创建
## 创建序列 - seq()
seq(from_num, to_num, by_num)
## 创建重复值 - rep()
rep(x, n)
替换
根据值来替换
## object[object condition] <- XX <- "" # 前后变量名必须一致
leadership$age[leadership$age>75]<-"Elder"
## ifelse(test, yes, no)
temp6$budget <- with(temp6,{
ifelse(budget<(qnt[1]-h),NA,budget)
ifelse(budget>(qnt[2]+h),NA,budget)})
temp6 <- na.omit(temp6)
## sub()
sub(patter, replacement, object, ignore.case=FALSE, fixed=FALSE)
--# patter表达式/文本字符串, replacement要替换的值,在object中搜索pattern;fixed=F(默认),pattern为正则表达式;fixed=T,pattern为字符串文本 (相似于vlookup函数)
--
根据位置来替换
## substr() - 返回中间的部分;即替换
substr(object,star_num,stop_num)
substr(object,star_num,stop_num) <- "xx" #用xx替换其之间的值;若数量少于则循环,若大于则不会覆盖超出部分
复杂替换:正则表达式
拆分
## strspilt
x <- strspilt(object, "sep", fixed=FALSE)
-- # 对object按照”sep"进行分割,若fixed=F(默认),sep为正则表达式;否则为文本字符串;
strspilt("abc", "") --返回含1个成分,3个元素的列表"a" "b" "c"
合并
## cat合并;将所有的对象合并为一个单元格的值
object <- "name"
x <- cat("x1","x2",object, num, [sep=""] )
## paste合并;若对象为不同“列”,则一一对应合并;若对象有3列,合并后仍为3列
paste("x1","x2",4\n, …, [sep=""])
cat( ) 与 paste( ) 相同与区别
- 区别:
- paste( ) 对应的列单独合并
- cat( ) 合并为一个单元格
paste(c("X","Y"),1:10,sep="") # [1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10" cat(c("X","Y"),1:10,sep="") # XY12345678910
长度
## 计算字符数量 - nchar
## 计算元素数量 - length
x1<-c("ab","cde","fghij")
nchar(x1)----2,3,5
length(x1)----3
字符规则
引用符 | 字符 | 含义 |
---|---|---|
Quotes | \n | newline;换行 |
Quotes | \r | carriage return |
Quotes | \t | tab;制表符 |
Quotes | \b | backspace;空格 |
Quotes | \a | alert (bell) |
Quotes | \f | form feed |
Quotes | \v | vertical tab |
Quotes | \ | backslash \ |
Quotes | ' | ASCII apostrophe '(单引号) |
Quotes | " | ASCII quotation mark "(双引号) |
Quotes | ` | ASCII grave accent (backtick) ` |
Quotes | \nnn | character with given octal code (1, 2 or 3 digits) |
Quotes | \xnn | character with given hex code (1 or 2 hex digits) |
Quotes | \unnnn | Unicode character with given code (1--4 hex digits) |
Quotes | \Unnnnnnnn | Unicode character with given code (1--8 hex digits) |
表格相关
返回指定子集 - 行
library(dplyr)
filter()
## 根据条件选取 filter(tbl_df, cond)
filter(hflights_df, Month == 1, DayofMonth == 1)
<- filter(tbl_df, x %in% c("a","b"))
# 集合运算:并且(&),或者(|)
# 条件判断1: %in% - 表示x中含"a"或者"b"的值,返回为逻辑为真
# 条件判断2:否定(!=)、大于(>)、大于等于(>=)、恒等于(==)
## 排除多条件的观测值 / 或者用 & 联接
<- filter(iris,!Species %in% c("setosa"))
<- filter(iris,Species !="setosa" & Species != "kaggle")
## 选中子集中的特定列
filter() %>% select(., var)
## 通过行数的位置进行选取
filter(tbl_df, n:n) # 等价于data[n:n, ]
--------------------------------------------------------------------------------------
## 前/后/任意选取
head(data, n) 等价于 first(data, n)
tail(data, n) 等价于 last(data, n)
nth(x) # 返回第x个观测 (dplyr包)
## 随机选取
sample_frac(iris, 0.5, replace=TRUE) # 按比例
sample_n(iris, 10, replace=TRUE) # 按数量
## 选取并排列前n个数
top_n(tbl_df, n)
top_n(tbl_df,-n) # 从底部开始选择n个数据
## 删除重复值
distinct(hflights_df, Month, .keep_all = TRUE)
#.keep_all = TRUE指保留除Month以外的其它列的内容。默认的情况是不保存其他列的。
- vector-向量
x <- x[num:num] x <- x[c(num1,num2,num3)]
- 矩阵/数组/数据框
## 一般选取 z <- z[i,j] / z[i, ] / z[, j] ## 连续选取 z[i:j, ] / z[ ,i:j] / z[i:j] # []方括号中无逗号出现,表示选取列 z[c("row","row") , ] z[, c("col","col")] z[c("col", "col")]
- 列表
x <- mylist[[ ]] # 其中规则与数据框中相同
--
## subset选取
subset(data, condition, select=c(col1,col2) / col1:col2 )
返回指定子集 - 列
library(dplyr)
select()
## 通过列名来选取
select(tbl_df, var1,var2)
#连续多变量 select(tbl_df, var1:var4)
#排除某变量 select(tbl_df, -var) / select(tbl_df, -(var1:var4))
## 不同条件列选择 - select_if()
hflights %>% select_if(is.factor)
hflights %>% select_if(function(col) is.numeric(col) && mean(col) > 3.5)
-------------------------------------------------------------------------------------------
## 通过选项函数进行选择
#列名中以元素x为首的列 - starts_with("x")
select(iris_df, starts_with("Petal"))
#列名中以元素x结尾的列 - ends_with("x")
select(iris, ends_with("Width"))
#列名中包含元素x的列 - contains("x")
select(iris_df, contains("etal"))
#排除对应的列,函数前加负号 -
select(iris_df, - starts_with("Petal"))
#所有变量 - everything() 一般调整数据集中变量顺序时使用
select(df2tbl,y,everything()) #将变量y放到最前
#选择包含在声明变量中的 - one_of("")
select(iris_df, one_of("Species","Petal.Width")) # 等价于 select(tbl_df, var,var)
#选择名称符合指定匹配正则表达式的列 - matches("")
select(iris, matches(".t."))
#选择x01到x05的变量
num_range('x', 1:5, width = 2)
创建新变量
library(dplyr)
## 计算并添加一个/多个新列 - mutate()
mutate(tbl_df, var3=var1+var2, var4=var3+..)
# 优势在于可对刚添加的列进行变换
`mutate(hflights_df, gain = ArrDelay - DepDelay, gain_per_hour = gain / (AirTime / 60))`
## 对每一列运行窗口函数 - mutate_each()
mutate_each(iris, funs(min_rank), [var1,var2])
# 窗口函数
--between() # 数据在a、b之间
--lag # 把除最后一位以外的所有数据延后,第一个元素为NA
--ntile # 把数据分为n分
--lead # 把除第一个值以外的所有元素提前,最后一位为NA
--percent_rank # 把数据在[0,1]中重组,并排序
--row_number # 排序。并列时将并列数在前的序号在前
--dense_rank #无缝排序
--min_rank # 排序,并列时,其他序号延号
--------------------------------------------------------------------------------------
## 计算并添加一个/多个新列,并删除原列 - transfrom()
transform(df, var3=var1+var2) #该函数扩展新变量的同时,将删除所有原始变量
## 创建新列
data$new_col <- c( , )
概述函数
library(dplry)
summarize()
## 对数据进行概述,并创建新的子集
summarize(tbl_df,FUN,na.rm=T) # 常伴有na.rm=T
`summarize(hflights_df, delay = mean(DepDelay, na.rm = TRUE))`
# 概述函数
--first() / last() / nth()
--n() / n_distinct()
--min() / max() / mean() / sd() / median() / IQR() / sum()
## 分组后求数据聚合
summarize(group_by(df2tbl,x), sum(y))
group_by(tbl_df,var) %>% summarize(., sum(Y))
## 对每一列运行概述函数
summarise_each(iris, funs(mean))
--------------------------------------------------------------------------------------
count()
## 计算变量中每一个特定值的行数
count(tbl_df, var, [wt=])
# wt="" 若缺失,则统计数量;分类统计观测值行数
count(iris, Species) # 分组计算Species列中各类别的频量;类似于基本函数包中的table函数
# wt="",若指定某一列,则会通过计算非缺失值的总和来比对权重(weighted);
# wt = var2 , 表示按var中的类别来分组计算var2中未缺失值的对应的求和
count(iris, Species, wt=Sepal.Length) # 即按Species分组后,求对应Sepal.Length中的值的总和
--等价于 iris %>% group_by(., Species) %>% summarize(., sum(Sepal.Length))
分组与排序
library(dplyr)
gropu_by
## 分组
groub_by(tbl_df, var) # var为分组变量
# 为每一个分组分别进行概述
iris %>% group_by(., Species) %>% summarize(., sum(Sepal.Length))
# 按组计算新变量
iris %>% group_by(., Species) %>% mutate(., ...))
## 移出数据框的分组信息
ungroup(iris)
--
library(dplyr)
排序 - arrange()
# arrange(tbl_df,var,desc(var)) # 默认为升序排序;降序为desc
arrange(flights, desc(dep_delay - arr_delay))
# 可以在排序里面使用计算
--------------------------------------------------------------------------------------
## 排序 reorder
# 以对col2列进行函数FUN处理后为排序标准,对col1进行排序;默认为升序,且默认转为有序因子order=T
reorder(data$col1, data$col2,FUN,[order=T])
with(InsectSprays, reorder(spray, count, median) # 以count列的中位数为排序标准对spray进行升序排列
--------------------------------------------------------------------------------------
## 排序 - order
data[order(data$col1, -data$col2), ] # 负号,表示降序;
数据合并
## 合并行
rbind(object1, object2)
--
## 合并列
cbind(object1, object2) # object1在前;但每个对象必须有相同的行数,且有相同的顺序;
cbind(object1,object[,-1]) / cbind(object1, data$col)
#1.当合并的对象中有要丢弃的向量时,可一步完成;
#2.若不是对于丢弃的向量,data[,j]表示的是跟data的第j列合并
## merge合并
merge(object1, object2, by="col_name"/=c("x1","x2")) # 按照by的内容来合并列
数据拆分
对整个表格数据作用
## 将连续型变量x分给为n个区间;用于创建美观的分割点
pretty(x, n)
## 将连续型变量x分割成有n个水平的因子
cut(x, n,[order_result=TRUE])
数据划分
## 划分训练集、测试集
library(caret)
set.seed(1234) # 必须要有,因为划分是随机划分的;
createDataPartition(y, p=0.x , time=1, list=TRUE)
# time=num, (默认为1),要创建的分区的数目
# p=0.x , 划分为p%的训练数据的百分比,故(1-p)为检验样本量的百分比
# list=FALSE/TRUE,逻辑值; 一般为FALSE
# y, target variable,目标变量
inTraining <- createDataPartition(hr_model$left, p = .75, list = FALSE) # 将数据进行划分成75%的训练样本和25%检验样本
training <- hr_model[ inTraining,] -将75%的训练样本数据添加到hr_model
testing <- hr_model[-inTraining,] -将余下25%的检验样本数据添加到hr_model
print(table(hr_model$left)) - 输出分割后的数据行数
日期处理
## 当前日期
Sys.Date() / data()
## 日期间隔 - difftme
difftime(object1, object2, units="")
--"auto”,"secs”,"mins”,"hours”,"days”,"weeks”其中的一个,默认为天
数字处理
舍入
## 指定小数位数(舍入) - round
round(x, [digits=num]) # 将x舍入为指定位数n的小数(默认值为0)
## 指定有效位数(舍入) - sigif()
sigif(x, [digits=num]) # 指定最小值的有效位数
--sigif(3.531,digits=2) # 返回 3.5
## 取整 - trunc()
trunc(3.531) # 返回3
## 取整 - 向上/向下
floor() # 向下取整;等同于Int
ceiling() # 向上取整(大于等于x最小整数)
-------------------------------------
abs(x) # 绝对值
x %% y # 余数
exp(x) # 指数
ln(x) / log(x,[y]) # 对数
sqrt(x) # 平方根
x^n # 幂次方
--
## 列/行求和
colSums(x)
rowSums(x)
## 行/列均值
colMeans(x)
rowMeans(x)
range(object) # 值域
quantile(x,c(0.n,0.n)) # 分位数
sd(x) # 标准差
var(x) # 方差
缺失值与唯一值
缺失值与不可能值
## 检查缺失值
is.na(x) # 缺失值
colSums(is.na(x)) # 求该列缺失值的数量
mean(is.na(x)) # 若比例小,可直接移除 na.omit(x)
is.nan(x) # 不可能值
is.infinite(x) # 无穷值
---------------------------------------------
## 移除缺失值
na.rm = T # 在计算之前将缺失值移除,可用在函数内部
## 整行删除
na.omit(x) # 移除所有含缺失值所在的行【删除整行】
newdata <- na.omit(mydata) # 用来存储没有缺失值的数据
--
唯一值
## 只对向量可用;或对 各行中各变量完全相同的行取一行
unique(x)
## 可对数据框使用
!duplicated(x) # 返回逻辑值;若完全相同则为TRUE
逻辑:返回data中所有不相同的值,然后在进行行选取data[x, ]
# 删除各行中变量完全相同的值 = unique(x)
data <- data[!duplicated(data), ] --# 返回各列所有相同的值 data[duplicated(test),]
# 删除某变量中相同的值
data <- data[!duplicated(test[, "var"]), ]
-- # 返回单列所有相同的值 data[duplicate(test[,var]),]
# 删除某两个变量完全相同的行
data <- data[!duplicated(test[, c("var1","var2")], ]
-- # 返回多列相同的值 data[dulpicated(test[,c("var1","var2")],]
逻辑判断
which() # 返回为真的逻辑对象,允许对数组array使用
R符号
名称 | 作用 | 示例 |
---|---|---|
<- | 赋值符号 | |
/ | 转义符 | |
[ ] | 给定元素所处位置的数值 | a[c(2,4)] |
: | 用于表示一个数值序列 | a[2:6] |
[i,j] | 选择指定的行与列 | [i,] [,j] [i,j] [,] |
"" | 用于目录名、文件名、包 | |
' ' | 引用双引号的文字为文本时出现 | labs(title=' positon="fill" ') |
# | 用于注释。#之后出现的任何文本都会被R解释器忽视; 并且R只能对单行进行注释,故当出现多条命令符,需在每行前面加上# | |
$ | 选取一个给定数据框中的某个特定变量 | patientIDdata$age |
<<- | 特殊赋值符 | |
[[ ]] | 用于列表中选取对象 | mylist[["ages"]] mylist[[2]] |
^或** | 求幂 | |
x% %y | 求余数(x mod y) 5%%2=1 | |
x% / %y | 整数除法。5%/2%=2 | |
== | 严格等于(在浮点型数值时慎用==) | 2+2==4 |
!= | 不等于 | |
!x | 非x | |
x∣y | x或y | |
x&y | x和y | |
isTRUE(x) | 测试x是否为TRUE | |
[,-1] [-1,] [,c(-2,-3)]/[,-c(2,3)] | 删除第一列 删除第一行 删除多列,两种表达方式均可 | mydata<-mydata[,-1] mydata<-mydata[,-c(2,3)] |
"[" | 提取谋而对象一部分的函数,后跟序列数n;1表示该对象的第一部分; 2表示该对象的第二部分; |