《R语言与数据挖掘》③R语言对象的一般操作,数理统计命令,控制语句

书籍:《R语言与数据挖掘》

作者:张良均

出版社:机械工业出版社

ISBN:9787111540526

本书由北京华章图文信息有限公司授权杭州云悦读网络有限公司电子版制作与发行

版权所有·侵权必究


对象的一般操作

1.交互式修改数据
2.变量名
3.sort()、rank()、order()函数的基本操作

# 示例:利用交互式编辑器修改score数据集中变量p1的名称为student
# 交互式编辑器修改变量名
score <- data.frame(
  ID = c(1,2,3,4),
  Chinese = c(20,40,60,80),
  Math = c(70,90,100,99),
  PE = c(NA,NA,60,59)
)
fix(score)  # 打开交互式编辑器,数据框的交互式编辑器为一个Data Editor
score.list <- as.list(score)  # 将score转化为列表
fix(score.list)  # 打开交互式编辑器,列表的交互式编辑器为一个记事本



# 示例:使用rename()函数修改变量名
# rename()函数修改变量名
library(reshape)  # 加载reshape包
rename(score, c(ID = "学号"))  # 对score中的ID重命名为学号
rename(score.list, c(Chinese = "语文"))  # 对score.list中的Chinese重命名为语文



# 示例:使用name()函数修改变量名
# names()函数修改变量名
names(score)[4] <- "体育"  # 将score的第5列列名改为体育
score



# 示例:使用colnames()函数修改变量名
# colnames函数和rownames函数修改变量名
colnames(score)[4] <- "思想品德与健康"  # 将score的第4列列名改为思想品德与健康
rownames(score) <- letters[1:4]  # 将score的行名改为a, b, c, d




# 示例:检验数据集score中的缺失值,并删除score中含有缺失值的行
# 缺失值分析 
is.na(score)  # 缺失值检测,TURE表明该位置的值为缺失值
anyNA(score)  # 检测score是否存在缺失值
na.omit(score)  # 删除score中存在缺失值的行
complete.cases(score)  # 检测哪一行存在缺失值,FALSE表明该值所对应的行存在缺失值
score[complete.cases(score), ]  # 删除score中存在缺失值的行


score
# 示例:对数据集score中的变量Math和Chinese进行排序
# 使用sort函数排序
sort(score$Math)  # 对score的math列按照从小到大排列
sort(score$Math, decreasing = TRUE)  # 对score的math列按照从大到小排列
sort(score$思想品德与健康, na.last = TRUE)  # 对score的Chinese列按照从小到大排列,并且把缺失值放在最后



# 示例:对向量x进行排序
# 使用rank函数排序
x <- c(1.1,2.1,3.2,0.5)
x
length(x)
rank(x) # 求出x的秩
rank(x, ties.method = "first")  # 求x的秩,ties.method = "first"
rank(x, ties.method = "random")  # 求x的秩,ties.method = " random " 
rank(x, ties.method = "max")  # 求x的秩,ties.method = " max "



#	示例:将数据集score按照变量Math进行排序
# 使用order函数排序
order(score$Math,decreasing = TRUE)  # 对score$Math升序排列,返回的值表示对应值在原向量中的位置。
score[order(score$Math), ]
score[order(-score$Math), ]  # 输出排序结果,降序

# 随机抽样简单抽样
sample(x=6,size=3,replace = F, prob=c(0.1,0.2,0.3,0.2,0.1,0.1))
# replace 控制放回和不放回

# 分层抽样
library(sampling)
df=data.frame(x=c(1,2,2,3,3,4),api=c('index','index','logout','show','show','index'))
df
sub2=strata(df, stratanames = 'x',size=c(1,2,1,1), method='srswor',description=T)

# data: 带抽样数据
# stratanames: 进行分层所依据的变量名称
# size: 各层中要抽出的观测样本数
# method: 选择4中抽样方法,分别为无放回、有放回、泊松、系统抽样,默认为srswor
# pik: 设置各层中样本的抽样概率
# description: 选择是否输出含有各层基本信息的结果

# 	示例:放回简单随机抽样
# 放回简单随机抽样
library(sampling)
LETTERS
(s <- srswr(10, 26))  # 在26个字母中有放回地抽取10个样本
(obs <- ((1:26)[s != 0]) )  # 提取被抽到的样本单元的编号
(n <- s[s != 0])  # 提取每个样本被抽到的次数
(obs <- rep(obs, times = n))  # 被抽到的样本单元的编号按照抽到的次数重复。
(sample <- LETTERS[obs])

# 示例:不放回简单随机抽样
# 不放回简单随机抽样
library(sampling)
LETTERS
(s <- srswor(10, 26))  # 在20个样本中无放回地抽取5个样本
(obs <- ((1:26)[s != 0]) )  # 提取被抽到的样本单元的编号
(sample <- LETTERS[obs])



#	示例:用sample函数进行简单随机抽样
# 使用sample函数抽样
LETTERS
sample(LETTERS, 5, replace=TRUE)  # 放回简单随机抽样
sample(LETTERS, 5, replace=FALSE)  # 不放回简单随机抽样
# 生成随机分组结果,第一组和第二组比例为7:3
n <- sample(2, 26, replace = TRUE, prob = c(0.7, 0.3)) 
n
(sample1 <- LETTERS[n == 1])  # 第一组
(sample2 <- LETTERS[n == 2])  # 第二组


# 数学函数示例

x <- c(1.12, -1.234, 3.1, 2.3, -4)
abs(x)  # 绝对值
sqrt(25)  # 平方根
ceiling(x)  # 不小于x的最小整数,向上取整
floor(x)  # 不大于x的最大整数,向下去整
round(x, digits = 1)  # 将x舍入为指定位的小数
signif(x, digits = 1)	# 将x舍入为指定的有效数字位数


rivers
# 统计函数示例
mean(rivers)  # 平均值
median(rivers)  # 中位数
sd(rivers)  # 标准差
var(rivers)  # 方差
quantile(rivers, c(.3, .84))  #计算0.3和0.84的分位数
range(rivers)  # 值域
min(rivers)  # 最小值
max(rivers)  # 最大值
scale(cars, center = T, scale = F)  # 中心化
scale(cars, center = T, scale = T)  # 标准化
diff(cars[, 1])  # 滞后差分
# 求时间间隔
date <- c("2016-01-27", "2016-02-27")
difftime(date[2], date[1], units = "days")  # 时间间隔为天
difftime(date[2], date[1], units = "weeks")  # 时间间隔为周




# 随机生成正态分布数据并求其密度和分位数。
data <- rnorm(20)  # 生成20个标准正态分布的数据
data
dnorm(data)  # 计算data中各个值对应标准正态分布的密度
pnorm(data)  # 计算data中各个值对应标准正态分布的分位数
qnorm(0.9, mean = 0, sd = 1)  # 计算标准正态分布的0.9分位数




# 字符串查询
txt <- c("Whatever", "is", "worth", "doing", "is", "wo rth", "doing", "well")
# grep()函数
grep("e.*r|wo", txt, fixed = FALSE)  # 查询含有"e...r"或"wo"的字符串,返回匹配项下标
# grepl()函数
grepl("e.*r|wo", txt)  # 返回一个逻辑向量,TRUE表示匹配
# gregexpr()函数
gregexpr("e.*r|wo", txt)  # 返回一个列表,结果包括匹配项的起始位置及匹配项长度
# regexec()函数
regexec("e.*r|wo", txt)  # 结果与gregexpr()函数相同
# regexpr()函数
regexpr("e.*r|wo", txt)  # 返回匹配项的起始位置及匹配项长度



# 字符串替换
txt <- c("Whatever", "is", "worth", "doing", "is", "worth", "doing", "well")
sub("[tr]", "k", txt)  # 各分量第一个"t"或"r"替换为"k"
gsub("[tr]", "k", txt)  # 所有"t"和"r"替换为"k"




# 字符串拆分
data <- c("2016年1月1日", "2016年2月1日")
strsplit(data, "年")  # 以"年"为分隔符拆分字符串,字符串拆分后以列表形式存储
strsplit(data, "年")[[1]][1]  # 提取列表中的元素



# 字符串连接
paste("AB", 1:5, sep = "")  # 将"AB"与向量1:5连接起来
x <- list(a = "1st", b = "2nd", c = "3rd")
y <- list(d = 1, e = 2,f = 3)
paste(x, y, sep = "-")  # 用符号"-"连接x与y,较短的向量被循环使用
paste(x, y, sep = "-", collapse = "; ")  # 设置collapse参数,连成一个字符串
paste(x, collapse = ", ")  # 将x的各分量连接为一个字符串,符号",  "为各分量的分隔符

# 数据汇总统计
attach(mtcars)
colnames(mtcars)  # 变量重命名
aggregate(mtcars[, c(1, 3)], by = list(cyl, gear), FUN = mean)  # 数据汇总统计

# 示例:使用melt()函数融合数据框和数组的数据
# 数据融合
library(reshape2)
# 作用于数据框的例子
head(airquality)  # 3.9 	示例:对数据集mtcars汇总统计
# 数据汇总统计
attach(mtcars)
colnames(mtcars)  # 变量重命名
aggregate(mtcars[, c(1, 3)], by = list(cyl, gear), FUN = mean)  # 数据汇总统计

# 数据融合
library(reshape2)
#  作用于数据框的例子
head(airquality)
# 保留变量"Ozone", "Month", "Day",其他的变量作为观测值,拉长数据框。
air_melt <- melt(airquality, id = c("Ozone", "Month", "Day"), na.rm = TRUE) 
head(air_melt)
# 作用于数组的例子
a <- array(c(1:11, NA), c(2, 3, 2)); a
a_melt <- melt(a, na.rm = TRUE, varnames = c("X", "Y", "Z"))  # 把高维数组a拉成一个数据框
head(a_melt)

# 数据重塑
# 分别求各月份Solar.R,Wind,Temp的平均值
air_cast <- dcast(air_melt, Month ~ variable, fun.aggregate = mean) 
air_cast




#  if / else语句 :若a<0,result1 = 0,若0<a<1,result1 = 1,若a > 1,result1 = 
a <- -1
if (a < 0)
  result <- 0 else if (a < 1) {
    result <- 1
  }  else
    result <- 2
result

#  switch语句 例:使用switch函数控制输出结果
switch(2, mean(1:10), 1:5, 1:10)  # 输出第二个向量
y <- "fruit"
switch(y, fruit = "apple", vegetable = "broccoli", meat = "beef")  # 输出fruit对应的值

# for循环 :使用for语句循环输出2,5,10的平方根
n <- c(2, 5, 10)
for (i in n) {
  x <- sqrt(i)  # 计算平方根
  cat("sqrt(", i, "): ", x, "\n")  # 输出每次循环的结果
}
# while循环 	示例:使用while语句生成10个斐波那契数列
x <- c(1, 1)
i <- 3
while (i <= 10) {  # 当i > 10时循环停止
  x[i] <- x[i - 1] + x[i - 2]  # 计算前两项的和
  i <- i + 1 } 
x
# 示例:根据用户的点击数将用户分为“初级用户”,“中级用户”或“高级用户”
#  repeat - break循环
pv <- c(1, 1, 2, 3, 1, 1, 15, 7, 18)
i <- 1 
result <- ""
repeat{
  if (i > length(pv)) {  # 设置循环结束时的跳出语句
    break
  }
  if (pv[i] <= 5) { 
    result[i] <- "初级用户"  # 点击数小于等于5的用户为“初级用户”
  } else if (pv[i] <= 15) {
    result[i] <- "中级用户"  # 点击数大于5小于等于15的用户为“中级用户”
  } else {
    result[i] <- "高级用户"  # 点击数大于15的用户为“高级用户”
  }
  i <- i + 1
}
result

# 自编函数计算标准差代码
# 计算标准差
# 自编函数
sd2 <- function(x) {
  # 异常处理,当输入的数据不是数值类型时报错   
  if (!is.numeric(x)) {                          
    stop("the input data must be numeric!\n") 
  }                                            
  # 异常处理,当仅输入一个数据的时候,告知不能计算标准差
  if (length(x) == 1){                          
    stop("can not compute sd for one number, 
         a numeric vector required.\n")       
  }
  # 初始化一个临时向量,保存循环的结果,
  # 求每个值与平均值的平方  
  x2 <- c()
  # 求该向量的平均值 
  meanx <- mean(x)
  # 循环 
  for (i in 1:length(x)) {   
    xn <- x[i] - meanx  
    x2[i] <- xn ^ 2
  }
  # 求总平方和
  sum2 <- sum(x2)
  # 计算标准差
  sd <- sqrt(sum2 / (length(x) - 1))
  # 返回值
  return(sd)
}
# 程序的检验
# 正常的情况
sd2(c(2, 6, 4, 9, 12))
# 一个数值的情况
sd2(3)
# 输入数据不为数值类型时
sd2(c("1", "2"))

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wency(王斯-CUEB)

我不是要饭的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值