第5章--高级数据管理

5.1 数值和字符处理函数

常用的数学函数

统计函数

例子:

> x <- c(1,2,3,4,5,6,7,8)
> mean(x)
[1] 4.5
> sd(x)
[1] 2.44949

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

newdata <- scale(mydata)

要对每一列进行任意均值和标准差的标准化,可以使用以下代码:

newdata <- scale(mydata)*SD + M

概率函数

概率函数通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值。

 

字符处理函数

 

其他实用函数

示例:

R函数可以应用到一系列的数据对象上,包括标量,向量,矩阵,数组和数据框。

> a <- 5
> sqrt(a)
[1] 2.236068
> b <- c(1.243,5.654,2.99)
> round(b)
[1] 1 6 3
> c <- matrix(runif(12),nrow=3)
> c[,1]       [,2]      [,3]       [,4]
[1,] 0.1994530 0.13714175 0.9197887 0.92626099
[2,] 0.1545716 0.05410748 0.7442934 0.20239342
[3,] 0.3898991 0.71826297 0.4518926 0.02659162

  > log(c)
            [,1]       [,2]      [,3]       [,4]
  [1,] -1.6121766 -1.9867402 -0.08361129 -0.07659924
  [2,] -1.8670979 -2.9167828 -0.29531995 -1.59754183
  [3,] -0.9418672 -0.3309195 -0.79431077 -3.62715915

  > mean(c)
  [1] 0.4103881

上面的mean函数是求整个矩阵的平均数,如果要分别求整行或者整列的平均数时,R提供了一个apply()函数,使用格式为:

apply(x, MARGIN, FUN,...)

MARGIN=1表示行,MARGIN=2表示列。

> mydata <- matrix(rnorm(30),nrow=6)
> mydata[,1]       [,2]        [,3]        [,4]       [,5]
[1,]  0.04888185 -1.6841123  0.20826767 -0.18079844  0.8770435
[2,]  2.24945461 -0.1110540 -0.88960378 -0.28632932 -1.9787470
[3,] -0.14309448  0.4394450 -0.04371930 -0.71101344  0.2028341
[4,] -0.90665601 -0.7176465  0.38136328 -0.06082567 -0.3844853
[5,] -0.40884645 -0.3192920  0.08476159 -0.47544146  0.1809374
[6,]  1.40852339  0.3653756  0.09148512 -1.06787472  1.0503215
> apply(mydata,1,mean)
[1] -0.14614355 -0.20325589 -0.05110963 -0.33765005 -0.18757618  0.36956618
> apply(mydata,2,mean)
[1]  0.374710485 -0.337880697 -0.027907572 -0.463713840 -0.008682649
> apply(mydata,2,mean,trim=0.2)
[1]  0.22636608 -0.19565422  0.08519877 -0.41339566  0.21908240

apply()是一个很强大的函数,可以把函数应用到数组的某个维度上,而lapply()和sapply()则可将函数应用到列表上。

示例:将学生的各科考试成绩组合为单一成绩衡量指标、基于相对名次(前20%,下20%,等等)给出从A到F的评分、根据学生姓氏和名字的首字母对花名册进行排序。

1. 限定输出小数点后数字的位数。

> rosterStudent Math Science English
1         John Davis  502      95      25
2    Angela Williams  600      99      22
3   Bullwinkle Moose  412      80      18
4        David Jones  358      82      15
5  Janice Markhammer  495      75      20
6     Cheryl Cushing  512      85      28
7     Reuven Ytzrhak  410      80      15
8          Greg Knox  625      95      30
9       Joel England  573      89      27
10      Mary Rayburn  522      86      18

2. 由于数学、科学和英语考试的分值不同,在组合之前要先让他们变得可以比较。可以使用scale()函数来成绩进行标准化表示。

> z <- scale(roster[,2:4])
> zMath     Science     English
1   0.01269128  1.07806562  0.58685145
2   1.14336936  1.59143020  0.03667822
3  -1.02568654 -0.84705156 -0.69688609
4  -1.64871324 -0.59036927 -1.24705932
5  -0.06807144 -1.48875728 -0.33010394
6   0.12806660 -0.20534583  1.13702468
7  -1.04876160 -0.84705156 -1.24705932
8   1.43180765  1.07806562  1.50380683
9   0.83185601  0.30801875  0.95363360
10  0.24344191 -0.07700469 -0.69688609
attr(,"scaled:center")Math Science English 500.9    86.6    21.8 
attr(,"scaled:scale")Math   Science   English 
86.673654  7.791734  5.452828 

3. 然后,可以通过mean()函数来计算各行的均值以获得综合评分,并使用cbind()将其添加到花名册中

> score <- apply(z,1,mean)
> roster <- cbind(roster, score)
> rosterStudent Math Science English      score
1         John Davis  502      95      25  0.5592028
2    Angela Williams  600      99      22  0.9238259
3   Bullwinkle Moose  412      80      18 -0.8565414
4        David Jones  358      82      15 -1.1620473
5  Janice Markhammer  495      75      20 -0.6289776
6     Cheryl Cushing  512      85      28  0.3532485
7     Reuven Ytzrhak  410      80      15 -1.0476242
8          Greg Knox  625      95      30  1.3378934
9       Joel England  573      89      27  0.6978361
10      Mary Rayburn  522      86      18 -0.1768163

4. quantile()给出了学生综合得分的百分位数

> y <- quantile(roster$score, c(.8,.6,.4,.2) )
> y80%        60%        40%        20% 0.7430341  0.4356302 -0.3576808 -0.8947579 

5. 通过使用逻辑运算符,你可以将学生的百分位数排名重编码为一个新的类别型成绩变量。

> roster$grade[score >= y[1]] <- "A"
> roster$grade[score < y[1] & score > y[2]] <- "B"
> roster$grade[score < y[2] & score > y[3]] <- "C"
> roster$grade[score < y[3] & score > y[4]] <- "D"
> roster$grade[score < y[4]] <- "F"
> rosterStudent Math Science English      score grade
1         John Davis  502      95      25  0.5592028     B
2    Angela Williams  600      99      22  0.9238259     A
3   Bullwinkle Moose  412      80      18 -0.8565414     D
4        David Jones  358      82      15 -1.1620473     F
5  Janice Markhammer  495      75      20 -0.6289776     D
6     Cheryl Cushing  512      85      28  0.3532485     C
7     Reuven Ytzrhak  410      80      15 -1.0476242     F
8          Greg Knox  625      95      30  1.3378934     A
9       Joel England  573      89      27  0.6978361     B
10      Mary Rayburn  522      86      18 -0.1768163     C

6. 你将使用函数strsplit()以空格为界把学生姓名拆分为姓氏和名字。

 

5.3 控制流

for结构:循环重复地执行一个语句,直到某个变量的值不再包含在序列seq中为止。

for (var in seq) statement

while结构:循环重复地执行一个语句,直到条件不为真为止。

while (cond) statement

if-else结构:控制结构if-else在某个给定条件为真时执行语句,也可以同时在条件为假时执行另外的语句。

if (cond) statement1 else statement2

ifelse结构:这个结构是上一个结构的比较紧凑的向量化版本。

ifelse(cond, statement1, statement2)

switch结构:根据一个表达式的值选择语句执行。

switch(expr,...)

 

5.4 用户自编函数

function()

myfunction <- function(arg1, arg2, ...){statementsreturn(object)
}

函数中的对象只在函数内部使用。返回对象的数据类型是任意的,从标量到

5.5 整合与重构

1.转置

转置(反转行和列)是重塑数据集的众多方法中最简单的一个,用函数t()即可对一个矩阵或数据框进行转置。

> cars <- mtcars[1:5,1:4]
> carsmpg cyl disp  hp
Mazda RX4         21.0   6  160 110
Mazda RX4 Wag     21.0   6  160 110
Datsun 710        22.8   4  108  93
Hornet 4 Drive    21.4   6  258 110
Hornet Sportabout 18.7   8  360 175
> t(cars)Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout
mpg         21            21       22.8           21.4              18.7
cyl          6             6        4.0            6.0               8.0
disp       160           160      108.0          258.0             360.0
hp         110           110       93.0          110.0             175.0

2.整合数据

在R中使用一个或多个by变量和一个预先定义好的函数来折叠数据是比较容易的。

aggregate(x, by, FUN)

其中x是待折叠对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,他将被用来计算新的观测值。

> options(digits=3)
> attach(mtcars)
> aggdata <- aggregate(mtcars,by=list(cyl,gear),FUN=mean,na.rm=TRUE)
> aggdataGroup.1 Group.2  mpg cyl disp  hp drat   wt qsec  vs   am gear carb
1       4       3 21.5   4  120  97 3.70 2.46 20.0 1.0 0.00    3 1.00
2       6       3 19.8   6  242 108 2.92 3.34 19.8 1.0 0.00    3 1.00
3       8       3 15.1   8  358 194 3.12 4.10 17.1 0.0 0.00    3 3.08
4       4       4 26.9   4  103  76 4.11 2.38 19.6 1.0 0.75    4 1.50
5       6       4 19.8   6  164 116 3.91 3.09 17.7 0.5 0.50    4 4.00
6       4       5 28.2   4  108 102 4.10 1.83 16.8 0.5 1.00    5 2.00
7       6       5 19.7   6  145 175 3.62 2.77 15.5 0.0 1.00    5 6.00
8       8       5 15.4   8  326 300 3.88 3.37 14.6 0.0 1.00    5 6.00

3. reshape包

融合

数据集的融合是将它重构为这样一种样式:每个测量变量独占一行,行中带有要唯一确定这个测量所需的标识符变量。

此处用R内置的数据集,首先将列明改写成小写,然后查看相应的数据

> names(airquality) <- tolower(names(airquality))
> head(airquality)ozone solar.r wind temp month day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6

先看用melt处理上述数据:

> aql <- melt(airquality)
No id variables; using all as measure variables
> head(aql)variable value
1    ozone    41
2    ozone    36
3    ozone    12
4    ozone    18
5    ozone    NA
6    ozone    28
> tail(aql)variable value
913      day    25
914      day    26
915      day    27
916      day    28
917      day    29
918      day    30

默认情况下,melt认为所有数值列的变量均有值。很多情况下,这都是我们想要的情况。在这里,我们想知道每个月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我们需要告诉meltmonthday是"ID variables"。ID variables就是那些能够区分不同行数据的变量,个人感觉类似于数据库中的主键。

> aql <- melt(airquality, id.vars = c("month", "day"))
> head(aql)month day variable value
1     5   1    ozone    41
2     5   2    ozone    36
3     5   3    ozone    12
4     5   4    ozone    18
5     5   5    ozone    NA
6     5   6    ozone    28

如果我们想修改长数据中的列名:

> aql <- melt(airquality, id.vars = c("month", "day"),variable.name = "climate_variable", value.name = "climate_value")
> head(aql)month day climate_variable climate_value
1     5   1            ozone            41
2     5   2            ozone            36
3     5   3            ozone            12
4     5   4            ozone            18
5     5   5            ozone            NA
6     5   6            ozone            28

cast函数

在reshape2中有好几个cast版本的函数。若你经常使用data.frame,就需要使用dcast函数。acast函数返回向量、矩阵或者数组。

dcast借助于公式来描述数据的形状,左边参数表示"ID variables",而右边的参数表示measured variables。可能需要几次尝试,才能找到合适的公式。

这里,我们需要告知dcastmonthday是ID variables,variable则表示measured variables。

转载于:https://www.cnblogs.com/cyoutetsu/p/5944943.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站

GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站 引文 如果你已经购买了Nuand&#xff08;官方&#xff09;BladeRF x40&#xff0c;那么就可以在上面运行OpenBTS并可以输入一些指令来完成一些任务。一般来说HackRF&#xff0c;是一款覆盖频率最宽的SDR板卡。它几乎所有的信息…

Linux 中断处理浅析

最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想. 于是整理一下~第一阶段&#xff0d;&#xff0d;获取中断号每个CPU都有响应中断的能力, 每个CPU响应中断时都走相同的流程. 这个流程就是内核…

用scikit-learn研究局部线性嵌入(LLE)

1. scikit-learn流形学习库概述 在scikit-learn中&#xff0c;流形学习库在sklearn.manifold包中。里面实现的流形学习算法有&#xff1a; 1&#xff09;多维尺度变换MDS算法&#xff1a;这个对应的类是MDS。MDS算法希望在降维时在高维里样本之间的欧式距离关系在低维可以得到保…

iOS app 企业内部发布及HTTPS服务器配置

转自: http://www.cnblogs.com/cocoajin/p/4082488.html iOS企业内部发布及HTTPS服务器配置 一&#xff1a;所需的条件 1. 苹果开发者证书&#xff0c;企业版 299$ 版本 2. ssl 证书&#xff0c;即https使用的服务器证书 3. web服务器&#xff0c;支持https 4. 一个域名&#x…

Pytorch超简单安装教程

安装Pytorch 1.1 安装Annaconda 安装Pytorch首先需要安装Annaconda&#xff0c;按照教程&#xff0c;安装了Annaconda5.2.0的版本。 路径 记住安装路径即可&#xff0c;其余均选默认。 1.2 安装Pytorch 第一步&#xff0c;打开Anaconda Prompt 。然后输入 conda create -n…

44. 源代码解读-RocketMQ-架构

1. 前言 1.1 github源代码 https://github.com/apache/rocketmq 1.2 github其他客户端&#xff0c;比如c,php https://github.com/apache/rocketmq-externals 1.3 运行进程 RocketMQ分成两个进程运行 NamesrvBrokerNamesrv&#xff0c;命名服务&#xff0c;主要负责Broker状态管…

Pytorch基础(一) —— tensorboard的应用

一、简介与安装方法 1.1 概念 Tensorboard 是 TensorFlow 的一个工具包&#xff0c;用于展示网络图、张量的指标变化和分布情况&#xff0c;如权重W、偏置B、卷积层数、全连接层数等参数&#xff0c;使用该工具可以方便观察神经网络训练过程&#xff0c;分析学习模型训练的效…

【WIN10】WIN2D——基本圖形的繪製

DEMO下載地址&#xff1a;http://yunpan.cn/c3iNuHFFAcr8h &#xff08;提取码&#xff1a;8e48&#xff09; 先看一個截圖&#xff1a; 繪製了一些基本形狀。 DEMO的繪製代碼都非常簡單&#xff0c;不想在博客裡細說了&#xff0c;看代碼更為清晰些。 可能繪製扇形的代碼有些麻…

python socket 网络编程

socket 套接字&#xff1a;网络接口。 我们在网络上需要传输自己需要的数据&#xff0c;我们在网络上传输数据使用的是网络协议&#xff0c; 而套接字就是我们将数据从本地采用协议传输的接口 socket模型&#xff1a; socket族&#xff1a; #AF_UNIX 被使用在类unix系统之间进行…

Python中利用plt显示中文标题解决方案

解决方法 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False plt.title(灰度级别频率图) plt.show()

Pytorch基础(四)—— 卷积层

一、概念 卷积从数学的角度讲是一种矩阵的运算方法。我们可以用一个卷积核对一个矩阵进行卷积运算&#xff0c;具体运算过程图示可以见pytorch官网。 卷积运算按输入数据的通道数可分为单通道和多通道两种。 单通道是指卷积核只有一个的情况。 多通道包括两种。 分别是单个…

【图像处理】——创建一个新的图片

方法一:直接复制一个已经存在的图片 img.copy() 如果是想生成一个指定大小的图片,则可以通过numpy数组进行创建 方法二:通过numpy创建(注意有坑) img = numpy.zeros((h,w))#h,w是指定的图像的高和宽,这样看似可以其实不然上述方法得到的图像不是8位的,但是图像数组的…

How to make a Logical Volume ON AIX5.3

本文转自 xkdcc 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/brantc/116431&#xff0c;如需转载请自行联系原作者1. 确定要建立的卷大小&#xff0c;比如700M 2. 检查要建立逻辑卷的卷组上的PP大小&#xff08;PP:物理分区&#xff0c;PP si…

Pytorch基础(五)—— 池化层

一、概念 池化就是把数据压缩的过程&#xff0c;属于下采样的一种方法&#xff0c;可以显著降低神经网络计算复杂度&#xff0c;减少训练中的过拟合&#xff0c;同时可以使数据具有一定的不变性。 池化从方法上来讲可以分为average Pooling、max Pooling、Overlapping Poolin…

Pytorch基础(六)——激活函数

一、概念 激活函数顾名思义&#xff0c;就是一种可以给神经网络注入灵魂的一种方法&#xff0c;也可以称之为激活层。其计算就是将线性的函数转变为非线性函数的过程&#xff0c;只有这样&#xff0c;我们制作的深层神经网络才能无限逼近真实值。 自神经网络发展到目前为止&am…

【NOIP 模拟题】[T1] 等差数列(dp)

【题解】【dp】 【f[i][j]表示以i为结尾&#xff0c;j为公差的子序列个数】 【要注意有负数&#xff0c;所以将公差1000】 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int const p9901; int f[1010][2010],n,a[1010]; lo…

走在网页游戏开发的路上(十)

页游资源管理 现在页游的规模越来越来大&#xff0c;游戏内容丰富&#xff0c;资源管理变得很重要。现在一款SNS页游的所有资源可达50M&#xff0c;MMO页游更高达几百M&#xff0c;不可能把资源放到一个文件里面、也不可能一次性加载完所有资源。按200kb/s的下载速度来算&#…

Pytorch基础(七)——线性层(全连接层)

一、概念 在神经网络中&#xff0c;我们通常用线性层来完成两层神经元间的线性变换。 按照官网的解释&#xff0c;Linear.weight也即A&#xff0c; 我们可以称之为权重矩阵&#xff0c;对其转置后乘以输入数据(一般都是一维张量)&#xff0c;加上Linear.bias即b偏置。 二、P…