R语言的数据结构

R共有6种储存数据的对象类型

  • 向量
  • 列表
  • 数组
  • 数据框
  • 矩阵
  • 因子
数据结构示意.png

向量(Vectors)

向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。

# 创建一个向量
apple <- c('red','green',"yellow")
num <- c(12, 23, 34, 56, 78, 83)
print(apple)
print(num)

# 查看向量的类型.
print(class(apple))
[1] "red"    "green"  "yellow"
[1] 12 23 34 56 78 83
[1] "character"

** !!! 单个向量中,数据的类型必须是相同的**

# 向量元素的选取

# 与其他编程语言索引从0计数不同的是,R语言的索引从1开始计数
num[1]

# 选取多个元素
num[1:3]

# 索引前加 - 号代表除去这个元素的其他元素,可以看到结果中没有第二个元素
apple[-2]

# 选取除了第2个和第3个元素外的其他元素
num[-(2:3)]  
12
12 23 34
'red' 'yellow'
12 56 78 83

矩阵(Matrix)

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix创建矩阵。

# matrix(data = ,nrow = n,ncol = n,byrow = ,dimnames =list(row_vector,col_vector) )
# data包含了矩阵的元素
# nrow和ncol用以指定行和列的维数
# dimnames包含了可选的、以字符型向量表示的行名和列名
# byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。

# Create a matrix.
M = matrix( num, nrow = 2, ncol = 3, byrow = TRUE, dimnames = list(c('人口','面积'),c('北京','广州', '上海')))
print(M)
     北京 广州 上海
人口   12   23   34
面积   56   78   83
M1 <- matrix(1:20, nrow=5, ncol=4)
print(M1)
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
# 矩阵元素选取

# 选取列
M1[,2]

# 选取行
M1[1,]

# 选取单个元素
M1[3,4]

# 选取符合要求的元素
M1[M1>10]
6 7 8 9 10
1 6 11 16
18
11 12 13 14 15 16 17 18 19 20

数据框(data frame)

数据框是表格数据对象。与矩阵一样都是二维的,但是不同的是每列可以包含不同的数据模式。 第一列可以是数字,而第二列可以是字符,第三列可以是逻辑的。它是等长度的向量的列表。

df <- data.frame(
   gender = c("Male", "Male","Female"), 
   height = c(152, 171.5, 165), 
   weight = c(81,93, 78),
   Age = c(42,38,26)
)
df
gender       height      weight    Age
Male         152.0         81       42
Male         171.5         93       38
Female       165.0         78       26
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
patientdata
patientID    age   diabetes  status
1            25      Type1     Poor
2            34      Type2     Improved
3            28      Type1     Excellent
4            52      Type1     Poor
# 索引列
print(df$gender)
print(df[,2])
print(df[1:2])
print(df[['Age']])
[1] Male   Male   Female
Levels: Female Male
[1] 152.0 171.5 165.0
  gender height
1   Male  152.0
2   Male  171.5
3 Female  165.0
[1] 42 38 26
# 索引行
print(df[2:3,])
  gender height weight Age
2   Male  171.5     93  38
3 Female  165.0     78  26
# 特定条件索引
df[df$Age > 30]
gender   height   Age
Male     152.0    42
Male     171.5    38
Female   165.0    26
# 索引元素
print(patientdata[1,3])   # 第一列第三行

print(df$Age[1])    # Age列第一行

print(df[[2]][1])  # 第二列第一行

print(df[['Age']][1])  # Age列第一行
[1] Type1
Levels: Type1 Type2
[1] 42
[1] 152
[1] 42
# 生成成糖尿病类型变量diabetes和病情变量status的列联表
table(patientdata$diabetes, patientdata$status)
        Excellent Improved Poor
  Type1         1        0    2
  Type2         0        1    0

数组(Array)

虽然矩阵被限制为二维,但数组可以具有任何数量的维度。 数组函数使用一个dim属性创建所需的维数。 在下面的例子中,我们创建了一个包含两个元素的数组,每个元素为3x3个矩阵。

# Create an array.
a <- array(c('green','yellow'),dim = c(3,3,2))
print(a)
, , 1

     [,1]     [,2]     [,3]    
[1,] "green"  "yellow" "green" 
[2,] "yellow" "green"  "yellow"
[3,] "green"  "yellow" "green" 

, , 2

     [,1]     [,2]     [,3]    
[1,] "yellow" "green"  "yellow"
[2,] "green"  "yellow" "green" 
[3,] "yellow" "green"  "yellow"
dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2,3,4), dimnames=list(dim1, dim2, dim3))
print(z)
, , C1

   B1 B2 B3
A1  1  3  5
A2  2  4  6

, , C2

   B1 B2 B3
A1  7  9 11
A2  8 10 12

, , C3

   B1 B2 B3
A1 13 15 17
A2 14 16 18

, , C4

   B1 B2 B3
A1 19 21 23
A2 20 22 24

数组的索引同矩阵,只不过下标从2个变成了3个,数组同矩阵一样,数据类型必须一样

因子(Factors)

我们都知道,变量的类型可以分为如下几种

  • 类别变量(定性变量)
    • 无序类别变量(名义值):类别无法排序,没有顺序关系,比如行业类别,性别
    • 有序类别变量(顺序值):类别之间有顺序关系,比如等级,评价‘差’,‘一般’,‘很好’
  • 数值变量(定量变量)
    • 离散变量(有限值): 只能去有限个值的变量,可以一一列举。
    • 连续变量(无限值):在一个或多个区间内取任何值,连续不断不可一一列举,比如温度,身高。

类别变量在R中被称为因子,函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1-k ](其中k 是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。这种做法类似于python特征分子中的将类别变量dummy化

对于有序变量,我们还可以指定变量对应的编码,使编码与逻辑顺序相一致,比如low,mid,high对应1,2,3

patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
diabetes <- factor(diabetes)
status <- factor(status, order=TRUE)  # order=TRUE R将此变量当做有序变量对待
patientdata <- data.frame(patientID, age, diabetes, status)
str(patientdata)   # 数据的信息,相当于pandas中的info
summary(patientdata)  # 描述性统计
# 可以看到,描述性统计中,R对数值型分析了最大最小值等,而对因子采用了频数统计。
'data.frame':   4 obs. of  4 variables:
 $ patientID: num  1 2 3 4
 $ age      : num  25 34 28 52
 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
 $ status   : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3



   patientID         age         diabetes       status 
 Min.   :1.00   Min.   :25.00   Type1:3   Excellent:1  
 1st Qu.:1.75   1st Qu.:27.25   Type2:1   Improved :1  
 Median :2.50   Median :31.00             Poor     :2  
 Mean   :2.50   Mean   :34.75                          
 3rd Qu.:3.25   3rd Qu.:38.50                          
 Max.   :4.00   Max.   :52.00                          
# 如果变量的默认顺序不是按照逻辑顺序排列的,比如status如果是按照improved,poor,excellent排列,
# 那么默认的顺序就无法代表真实逻辑顺序。
# 因此,可以添加levels变量
status <- factor(status,order=TRUE,levels = c("poor", "improved", "excellent"))
# 这样就相当于指定了顺序,任何在数据中出现而未在参数中列举的数据都将被设为缺失值

列表

R中的列表比较像python中的列表,列表中的元素可以是单个字符,数值,也可以是向量,矩阵,数组等
列表就是一些对象的有序集合

# Create a list.
list1 <- list(c(2,5,3),21.3,sin)

# Print the list.
print(list1)
[[1]]
[1] 2 5 3

[[2]]
[1] 21.3

[[3]]
function (x)  .Primitive("sin")
g <- "My First List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow=5)
k <- c("one", "two", "three")
mylist <- list(title=g, ages=h, j, k)
print(mylistlist)
$title
[1] "My First List"

$ages
[1] 25 26 18 39

[[3]]
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

[[4]]
[1] "one"   "two"   "three"
mylist[['ages']]  # 输出ages
mylist[[2]]   # 输出第二个元素
25 26 18 39
25 26 18 39
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343