R的数据对象的初步概括

在R中,最基础的两个概念是对象和函数
下面介绍R中的数据对象
R的数据对象可以初步划分为数据类型相同的:如向量,因子factors,矩阵matrix,数组array
和数据类型不同的:如列表list和数据框DataFrame
通过Is(),objects()可以查看对象。
通过rm()可以移除对象。
对于向量,向量化是R相较于其他语言最优势莫过于它的向量化,向量化也是R中最有效率的。
example:

x<-c(1,3,5,7,9)
sqrt(x)

如果是c语言,就需要用for语句取出数据,再一个个的取平方根
如果是python也是用for语句一个个遍历
对于向量,一个向量里面的所有数据必须是同一数据格式,如果不是的话,就要进行强制转换,一般是将数值型数据转化为字符型
对于向量,可以创建空向量,向量内的数据也可以为NA(缺失值)
因子factor
因子代表着对象的类别,将相同的数据归为一个类别
example

> g<-factor(c("man","woman","man","woman"))
> g
[1] man   woman man   woman
Levels: man woman

levels代表的向量C的类型,只有man和woman
注意因子在R语言中是以数值类型表示,如”man”在R中的表示就是1,”woman”在R中表示就是2
在因子有个函数table()应用比较广泛,table可以统计因子各level的频数,也可以结合两个因子构成交叉表
example

> table(g)
g
  man woman 
    2     2 
> factor(c("adult","children","children","children"))
[1] adult    children children children
Levels: adult children
> m<-factor(c("adult","children","children","children"))
> table(g,m)
       m
g       adult children
  man       1        1
  woman     0        2

还有margin.table 和prop.table两个函数作为table的统计函数也很重要
margin.table(data,n)
n有两个值,一和二,如果是1的话统计行的频数,如果是2的话统计列的频数
example

> margin.table(g,m)
Error in margin.table(g, m) : 'x'不是陈列
> t<-table(g.m)
Error in table(g.m) : object 'g.m' not found
> t<-table(g,m)
> margin.table(t)
[1] 4
> margin.table(t,1)
g
  man woman 
    2     2 
> margin.table(t,2)
m
   adult children 
       1        3 

prop.table(data,n)同样也是统计因子,只不过统计的是占比
n=1时候以行为标准,n=2时候以列为标准
example

> prop.table(t)
       m
g       adult children
  man    0.25     0.25
  woman  0.00     0.50
> prop.table(t,1)
       m
g       adult children
  man     0.5      0.5
  woman   0.0      1.0
> prop.table(t,2)
       m
g           adult  children
  man   1.0000000 0.3333333
  woman 0.0000000 0.6666667
> 

序列
生成序列的方法有很多种,主干是生成有序数列和无序数列
有序序列的生成方法
第一种是向量法 c<-1:10000
第二种是用seq函数 seq(from=,to=,length=)其实seq中有很多默认参数,一般常用的就只有by(代表步长和length(长度)
第三种就是rep(data,n) rep是一种复制函数,能将n代表的复制次数
最后一种gl(k,n,lables=c( )) k代表的因子水平个数,n代表k重复个数,lables是因子的标签
终上四种方式都是有序的,序列里面的data都是有迹可循的
生成无序序列的方法
第一种,用rnorm(n,mean=x,sd=y) mean代表平均值,sd代表标准差
生成的是长度为n,平均值为x,标准差为y的随机序列
第二种,用rt(n,df=x)
生成的是自由度为x,长度为n的随机序列
example如下

> seq(-4,100,2)
 [1]  -4  -2   0   2   4   6   8  10  12  14  16  18
[13]  20  22  24  26  28  30  32  34  36  38  40  42
[25]  44  46  48  50  52  54  56  58  60  62  64  66
[37]  68  70  72  74  76  78  80  82  84  86  88  90
[49]  92  94  96  98 100
> seq(from=1,to=5,length=4)
[1] 1.000000 2.333333 3.666667 5.000000
> length(length=10,from=-4,by=0.5)
Error in length(length = 10, from = -4, by = 0.5) : 
  3 arguments passed to 'length' which requires 1
> seq(length=10,from=-4,by=0.5)
 [1] -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5  0.0  0.5
> rep("nihao",each=10)
 [1] "nihao" "nihao" "nihao" "nihao" "nihao" "nihao"
 [7] "nihao" "nihao" "nihao" "nihao"
> gl(2,5)
 [1] 1 1 1 1 1 2 2 2 2 2
Levels: 1 2
> a<-gl(2,5)
> type(a)
Error in type(a) : could not find function "type"
> class(a)
[1] "factor"
> a<-gl(2,5,labels = c("man","female"))
> a
 [1] man    man    man    man    man    female female
 [8] female female female
Levels: man female
> rnorm(5,mean = 10,sd=2)
[1] 12.096249 11.499978 10.603317  8.949008  6.570919
> rt(5,df=100)
[1] -0.7648056 -0.7490618 -2.6534510 -0.3552033
[5] -0.1059763

数据子集
[]是数据子集重要的概念,数据对象带有[]和数据对象不带[]返回的结果完全是不一样的
example

> x<-c(-1,0,-2,3,4,8,-100)
> x>0
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE
> x[x>0]
[1] 3 4 8

在这个例子中,如果是x>0,返回的就是布尔类型的数据
但是如果输入x[x>0]返回的就是数值类型的数据
[]里面可以加很多条件来筛选符合条件的数据值
example

> x[x>2|x<0]
[1]   -1   -2    3    4    8 -100
> x[x>0&x<5]
[1] 3 4

有个比较重要的概率是”-“号,在python中,列表等数据对象中”-“号代表是从右向左进行索引,而在R中不同的是,”-“号代表除去该数值索引的所有数据
example

> x[-1]
[1]    0   -2    3    4    8 -100
> x[-(3:5)]
[1]   -1    0    8 -100
> x[-c(3,5,7)]
[1] -1  0  3  8

还有一个重要的概念是name属性
我们可以给R中的数据对象赋予name属性
example

> length(x)
[1] 7
> names(x)<-c("a","b","c","d","e","f","g")
> x
   a    b    c    d    e    f    g 
  -1    0   -2    3    4    8 -100 
> x[a]
 a  a  a  a  a  b  b  b  b  b 
-1 -1 -1 -1 -1  0  0  0  0  0 
> x["a"]
 a 
-1 
> x[c("a","e")]
 a  e 
-1  4

然后是二维的数据对象,数组和矩阵
矩阵是数组的特殊形式具有两个维度
下面是矩阵生成的几种方法:
第一种是由向量转化为矩阵,即一维数据对象转化为二维数据对象,需要有dim函数
examle

> m<-(1:10)
> m
 [1]  1  2  3  4  5  6  7  8  9 10
> ?dim
> a<-dim(m)<-(2,5)
Error: unexpected ',' in "a<-dim(m)<-(2,"
> a<-dim(m)<-c(2,5)
> a
[1] 2 5
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> dim(m)
[1] 2 5

第二种方法是用matrix直接生成矩阵,有一个参数需要特别注意byrow一般默认值为byrow=FLASE 也就是说数据填满矩阵的方式是按照列填满的,但是我们可以通过设置byrow=TRUE使数据按照行填满矩阵
我们同样可以设置colname和rowname给矩阵添加属性
example

> a<-matrix(seq(from=1,to=10,length=10),2,5)
> a
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> a<-matrix(seq(from=1,to=10,length=10),2,5,byrow=T)
> colnames(a)<-c("dasheng","tq","miss","you","so")
> rownames(a)<-c("nihao","bye")

然后是数组,矩阵是数组的特殊化,数组一般具有两个及以上的维度,具体的生成方法和矩阵相似
example

> a1<-array(seq(from=1,to=15,length=15),dim=c(1,3,5))
> a1
, , 1

     [,1] [,2] [,3]
[1,]    1    2    3

, , 2

     [,1] [,2] [,3]
[1,]    4    5    6

, , 3

     [,1] [,2] [,3]
[1,]    7    8    9

, , 4

     [,1] [,2] [,3]
[1,]   10   11   12

, , 5

     [,1] [,2] [,3]
[1,]   13   14   15

> a<-matrix(seq(from=1,to=10,length=10),dim=c(2,5),byrow=T)
Error in matrix(seq(from = 1, to = 10, length = 10), dim = c(2, 5), byrow = T) : 
  'dimnames' must be a list
> a<-matrix(seq(from=1,to=10,length=10),2,5,byrow=T)

下面介绍数据类型可以不同的两个数据对象,列表和数据框
在R中列表是挺重要的,因为它允许异质的数据类型,在列表中可以同时存在字符串类型,数值类型和布尔类型的数据
list的一个突出特点在于[]索引和[[]]索引返回的值不一样
[]还返回列表名,而[[]]只返回值
example

> my.lst<-list(stud.id=34453,stud.name="John",stud.marks=c(14.3,12.0,15.0,190))
> my.lst
$`id`
[1] 1

$name
[1] "John"

$mark
[1]  14.3  12.0  15.0 190.0

$new
[1] 1 3 5 7 9

> my.lst[[1]]
[1] 1
> 
> my.lst[1]
$`id`
[1] 1

list相较于其他数据对象还有一个特点在于它的”[Math Processing Error] " 符 号 , " ”是代表列表里面不同类的数据,可以直接通过”[Math Processing Error] " 符 号 索 引 , 来 获 取 值 , 也 可 以 直 接 改 值 , 也 可 以 通 过 " ”直接生成一个新的数据
example

> my.lst
$`stud.id`
[1] 34453

$stud.name
[1] "John"

$stud.marks
[1]  14.3  12.0  15.0 190.0

> my.lst$stud.id
[1] 34453
> my.lst$stud.id<-1
> my.lst$stud.id
[1] 1
> my.lst$new<-(seq(1,10,2))
> my.lst$new
[1] 1 3 5 7 9

names也是list的属性,可以较方便的更改list的数据名
example

> names(my.lst)
[1] "stud.id"    "stud.name"  "stud.marks"
> names(my.lst)<-c(id,name,marks)
Error: object 'name' not found
> names(my.lst)<-c("id","name","mark")
> names(my.lst)
[1] "id"   "name" "mark"
> 

再介绍c()函数和unlist()函数
c()函数将两个list直接连接在一起
unlist()取消list的属性,将数据直接化为向量形式
example

> other<-list(age=1,sex="man")
> c(other,my.lst)
$`age`
[1] 1

$sex
[1] "man"

$id
[1] 1

$name
[1] "John"

$mark
[1]  14.3  12.0  15.0 190.0

$new
[1] 1 3 5 7 9

> unlist(other)
  age   sex 
  "1" "man" 

最后的就是数据框了,数据框是允许数据类型不同的二维数据对象,和matrix的定义有些类似而有些又相反
数据框的创建和list的创建类似
example

> my.dataset<-data.frame(site=c("A","B","A","A","B"),
+                         season=c("Winter","Summer","Summer","Spring","Fall"),
+                         PH=c(7.4,6.3,8.6,7.2,8.9),stringsAsFactors=F)
> my.dataset
  site season  PH
1    A Winter 7.4
2    B Summer 6.3
3    A Summer 8.6
4    A Spring 7.2
5    B   Fall 8.9

按照条件筛选数据,通过subset函数
example

> subset(my.dataset,PH>8)
  site season  PH
3    A Summer 8.6
5    B   Fall 8.9
> subset(my.dataset,PH>8,site,PH)
Error in `[.data.frame`(x, r, vars, drop = drop) : object 'PH' not found
> subset(my.dataset,PH>8,"site","PH")
Error in drop && length(x) == 1L : invalid 'x' type in 'x && y'
> subset(my.dataset,PH>8,site:PH)
  site season  PH
3    A Summer 8.6
5    B   Fall 8.9
> subset(my.dataset,PH>8,season:PH)
  season  PH
3 Summer 8.6
5   Fall 8.9

看names属性
example

> colnames(my.dataset)
[1] "site"   "season" "PH"  
> rownames(my.dataset)
[1] "1" "2" "3" "4" "5" 

添加新列

> my.dataset$new<-c(1,20,15,12,21)
> my.dataset
  site season  PH new
1    A Winter 7.4   1
2    B Summer 6.3  20
3    A Summer 8.6  15
4    A Spring 7.2  12
5    B   Fall 8.9  21

看行数和列数
example

> nrow(my.dataset)
[1] 5
> ncol(my.dataset)
[1] 4

这些就是R语言的数据对象和一些初步的函数
是R语言的基础,是更深入学习R的基石。写下文章来做复习和总结,希望自己以后能够熟练的掌握R语言

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值