bmwm3 发表于 2017-6-22 06:59:32

R语言实战(二)数据管理

  本文对应《R语言实战》第4章:基本数据管理;第5章:高级数据管理
  创建新变量



#建议采用transform()函数
mydata <- transform(mydata,
sumx = x1 + x2,
meanx = (x1 + x2)/2)

  算术运算符




  +


  加




  -


  减




  *


  乘




  /


  除




  **或^


  求幂




  x%%y


  求余(x mod y)。5%%2的结果为1




  x%/%y


  整数除法。5%/%2的结果为2




  重编码




  <


  小于




  <=


  小于或等于




  >


  大于




  >=


  大于或等于




  ==


  严格等于(比较浮点类型时慎用,易误判)




  !=


  不等于




  !x


  非x




  x | y


  x或y




  x & y


  x和y




  isTRUE(x)


  x是否为TRUE







#较为直观
leadership$agecat <- “Elder”
leadership$agecat[leadership$age >= 55 &
leadership$age <= 75] <- “Middle”
leadership$agecat <- “Young”
#或者
leadership <- within(leadership, {
agecat <- NA
agecat <- “Elder”
agecat <- “Middle”
agecat <- “Young”
})

  
重命名



#交互式编辑器编辑变量名
fix(leadership)
#reshape包函数rename()
library(reshape)
leadership <- rename(leadership, c(manager = “managerID”, date = “testDate”))
#names()函数
names(leadership) <- c(“item1”, “item2”, “item3”, “item4”, “item5”)

  
缺失值
  缺失值NA(Not Available)不可能出现的值NaN(Not a Number)



#缺失值判定,返回同等大小对象,内容为TRUE或FALSE
is.na(object)
#缺失值无法比较,不能使用 ”==” 判断

  
异常值可以重编码为缺失值;分析中排除缺失值可以使用na.omit()函数。
  日期值
  as.Date(x, “input_format”)
  x为日期向量,”input_format”为输入格式




  %d

  数字表示的日期

  01~31


  %a

  缩写的星期名

  Mon


  %A

  非缩写的星期名

  Monday


  %m

  数字表示的月份

  00~12


  %b

  缩写的月份

  Jan


  %B

  非缩写的月份

  January


  %y

  两位数的年份

  07


  %Y

  四位数的年份

  2007



#示例
strDates <- c(“01/05/1965”, “08/16/1975”)
dates <- as.Date(strDates, “%m/%d/%Y”)

  
提示,也可以将日期转换为字符型变量,继续进行字符串的处理
  其他日期处理相关的包:lubridate, fCalendar
  类型转换





is.numeric()


as.numeric()



is.character()


as.character()



is.vector()


as.vector



is.matrix()


as.matrix()



is.data.frame()


as.data.frame()



is.factor()


as.factor



is.logical()


as.logical()


数据排序
order()函数,默认升序



#order()函数示例
newdata <- leadership
#依性别升序和年龄降序排列


数据集合并
添加行:
rbind()函数



total <- rbind(dataframeA, dataframeB)

两个数据框中必须要有相同的变量,顺序可以不相同
如果变量不一致,需要提前处理:删除多余变量;或者追加缺失值
添加列:
不指定公共索引时,可以使用cbind()
指定索引,使用merge()

数据集取子集
一般情况下,可以采用如下代码



newdata <- dataframe

变量(列)



#保留变量方式:
#指明具体列的序号
newdata <- leadership[, c(6:10)]
#指明列名称
myvars <- c(“q1”, “q2”, “q3”, “q4”, “q5”)
newdata <- leadership
#剔除变量方式:
#指明序号,使用负号剔除
newdata <- leadership
#设为未定义(NULL)
leadership$q3 <- leadership$q4 <- NULL
#指明列名称
myvars <- names(leadership) %in% c(“q3”, “q4”)
newdata <- leadership[!myvars]
#解释:names()函数生成包含所有变量名的字符型向量
# %in%将后面的向量以前面的向量为准进行匹配,返回布尔型向量
#翻转后即可实现向量匹配


观测(行)



#指明行序号
newdata <- leadership
#条件筛选
newdata <- leadership


subset()函数



#两个例子
newdata <- subset(leadership, age >= 35 | age < 24, select = c(q1, q2, q3, q4))
newdata <- subset(leadership, gender == “M” & age > 25, select = gender : q4)


随机抽样



mysample <- leadership


更多抽样方法将在后面作详细介绍

SQL语句操作数据框
package sqldf






数值和字符处理
数学函数





abs(x)


绝对值



sqrt(x)


平方根



ceiling(x)


向上取整



floor(x)


向下取整



trunc(x)


向0取整



round(x, digits = n)


将x舍入为指定位小数



signif(x, digits = n)


将x舍入为指定位有效数字



cos(x), sin(x), tan(x)


余弦正弦正切



acos(x), asin(x), atan(x)


反余弦反正弦反正切



cosh(x), sinh(x), tanh(x)


双曲余弦双曲正弦双曲正切



acosh(x), asinh(x), atanh(x)


反双曲余弦反双曲正弦反双曲正切



exp(x)


自然为底的指数函数



log(x, base = n)
log(x)
log10(x)


n为底的对数
log(x)为自然对数
log10(x)为常用对数


统计函数





mean(x)


平均数(声明里trim = 0.05表示丢弃最大最小的5%数据后的平均数)



median(x)


中位数



sd(x)


标准差



var(x)


方差



mad(x)


绝对中位数



quantile(x, probs)


分位数



range(x)


值域



sum(x)


求和



diff(x, lag = n)


滞后差分,lag指定滞后几项,默认1
x <- c(1, 5, 23, 29)
diff(x)返回c(4, 18, 6)



min(x)


最小值



max(x)


最大值



scale(x, center = TRUE, scale = TRUE)


为数据对象x按列进行中心化(center = TRUE)或标准化(center = TRUE, scale = TRUE)


关于scale()函数的说明:
默认情况下,该函数对矩阵或数据框的指定列进行均值为0,方差为1的标准化:



newdata <- scale(mydata)

要进行指定均值和方差,使用以下语句



newdata <- scale(mydata) * SD + M

对指定列进行标准化:



newdata <- transform(mydata, myvar = scale(myvar) * SD + M)


概率函数
形如
分布缩写
d = 密度函数(density)
p = 分布函数(distribution function)
q = 分位数函数(quantile function)
r = 生成随机数(随机偏差)





分布名称



缩写



分布名称



缩写





Beta分布



beta



Logistic分布



logis





二项分布



binom



多项分布



multinom





柯西分布



cauchy



负二项分布



nbinom





(非中心)卡方分布



chisq



正态分布



norm





指数分布



exp



泊松分布



pois





F分布



f



Wilcoxon符号秩分布



signrank





Gamma分布



gamma



t分布



t





几何分布



geom



均匀分布



unif





超几何分布



hyper



Weibull分布



weibull





对数正态分布



lnorm



Wilcoxon秩和分布



wilcox






如密度函数dnorm, 分布函数pnorm, 分位数函数qnorm, 随机数生成函数rnorm
设定随机数种子:使结果可以复现



set.seed(n)

生成多元正态数据:给定均值向量和协方差矩阵的数据集



library(MASS)
mvrnorm(n, mean, sigma)


字符处理函数





nchar(x)



计算x中字符数量





substr(x, start, stop)



提取或替换一个字符向量中的子串
substr(“abcdef”, 2, 4)#返回”bcd”
(substr(“abcdef”, 2, 4) <- “22222”)#返回”a222ef”





grep(pattern, x, ignore.case = FALSE, fixed = FALSE)



在x中搜索某种模式。fixed = FALSE, pattern为正则表达式,fixed = TRUE, pattern为文本字符串
返回值为匹配的下标





sub(pattern, replacement, x, ignore.case = FALSE, fixed = FALSE)



在x中搜索pattern, 并用replacement替换





strsplit(x, split, fixed = FALSE)



在split处分割x





paste(… , sep = “”)



连接字符串,分隔符为sep





toupper(x)



大写转换





tolower(x)



小写转换






函数grep(), sub()和strsplit()能够搜索文本字符串(fixed = TRUE)或者正则表达式(fixed = FALSE, 默认值)
正则表达式用法,参考https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

其他实用函数





length(x)



返回对象x的长度





seq(from, to, by)



生成一个序列
seq(1, 10, 2)#c(1, 3, 5, 7, 9)





rep(x, n)



将x重复n次





cut(x, n)



将连续型变量x分割为有着n个水平的因子





pretty(x, n)



创建美观的分割点。选取n+1个点,将x分割为n个区间,绘图常用





cat(…, file = “myfile”, append = FALSE)



连接…中的对象,并将其输出到屏幕上或文件中






将函数应用于矩阵和数据框
apply族函数,详细应用方式在另一本书中,到时补充吧
一般用法:
apply(x, MARGIN, FUN, …)
MARGIN = 1 表示应用到行,MARGIN = 2表示应用到列

控制流
循环:





for (var in seq) statement
while (cond) statement






只要可能,尽量应用apply族函数,避免循环语句

条件执行:



#if-else结构
if (cond) statement1 else statement2
#ifelse结构:程序行为是二元或输入输出均为向量,尽量使用本结构
ifelse(cond, statement1, statement2)
#switch结构
switch(expr, …)


自编函数
自编函数的一些注意事项,在Google’s R Style Guide (https://google.github.io/styleguide/Rguide.xml) 中提到,详情可直接参考网页

整合与重构
转置



#对矩阵或数据框进行转置
t()


整合数据
使用一个或多个变量,一个预先定义好的函数,对数据进行折叠(collapse)
aggregate(x, by, FUN)



#示例
attach(mtcars)
aggdata <- aggregate(mtcars, by = list(cyl, gear), FUN = mean, na.rm = TRUE)
#返回根据cyl, gear为组合的组为观测,各个变量的均值


reshape包(reshape2包)
融合与重铸



#融合,使每一行都是一个唯一的标识符-变量组合
library(reshape)
md <- melt(mydata, id = (c(“id”, “time”)))
#重铸
newdata <- cast(md, formula, FUN)
#formula形式:rowvar1 + rowvar2 + … ~ colvar1 + colvar2 + …
#左边为观测分组(行),右边为变量分组(列)


页: [1]
查看完整版本: R语言实战(二)数据管理