R语言与统计分析数据科学与R语言

R-数据处理基础篇-一篇概括总结R语言变量储存结构

2020-02-12  本文已影响0人  TroyShen

目录


0. 问题导入

当我们学习任何一门新的计算机语言的时候,开篇除了系统与语言环境配置,正式开始入门的就是该语言的变量储存方式与传递方式。但是,这部分真的总是整本书中最单调且朴实无华又有用的部分。而这部分单调的原因在于每一函数示例只有少数,而真正能够熟练掌握函数的唯一途径就是在实际过程中多用多练!!为了大家方便,我们将本篇的代码做成了一个R语言脚本,有需要的可以在【TheWhoOPs】公众号后边回复“基础数据处理”获取本篇代码哈~

为了缩短大家这块的学习时间,尽快入门,Jersey 特意将R语言变量储存结构进行了总结,大家看这篇基本可以开始实践啦

1.示例数据及样本程序

1.1 示例数据-R语言变量存储方式一:向量

如下例代码,本篇Jersey首先采用 runif()函数随机生成了一个长度(length)为20且取值范围在-10 ~10之间的随机实数组(runif(20,-10,10)),也引出了R语言第一种变量的储存方式:向量(vector)

向量属性及对应查询方式:

df = runif(20,-10,10)
head(df)
[1] -8.812040 -4.816596 -9.746894
[4]  5.261308  1.101738 -7.904380
length(df)
[1] 20
class(df)
[1] "numeric"
is.vector(df)
[1] TRUE
1.2 样本程序

本篇入门篇示例函数不再是hello world,而是加油武汉!!

fighting_for_wuhan <-function(){
  return("Fighting!! WUHAN")
}

R语言中函数的通常储存及调用方法:


图1 R语言中函数的通常储存及调用方法

2. R语言数据变量存储方式二之矩阵(matrix)

在第二节,我们基于示例数据df对R语言中的变量存储方式二:矩阵(matrix)进行具体介绍

2.1 基于向量的矩阵生成方法1

首先我们可以基于as.matrix()函数将向量型的数据转化为矩阵(matrix),不过如下代码所示,只能转为单列的矩阵。如果需要将其转为5行4列,或是4行5列,我们需要基于2.2 的方法。

mat1 = as.matrix(df)
mat1
             [,1]
 [1,]  1.51572303
 [2,] -0.45631803
 [3,]  0.92141092
 [4,] -0.03206002
 [5,] -9.00933680
 [6,] -5.25229404
 [7,]  3.95230102
 [8,]  7.94604772
 [9,] -8.06965130
[10,] -2.81624416
[11,] -3.64163339
[12,]  9.16364793
[13,] -6.33998803
[14,] -4.56757486
[15,] -2.48729855
[16,]  3.05898896
[17,]  2.51979639
[18,]  4.19247441
[19,] -9.92194021
[20,]  0.69833583
dim(mat1)
dim(mat1)
[1] 20  1
2.2 基于向量的矩阵生成方法2

基于向量的矩阵生成方法2 则是基于matrix函数,以向量为首项输入,行数为参数(nrow)进行生成。但是再生成的过程中有个重要的参数需要注意:
byrow = T/F
byrow这个布尔变量(其实就是是或否)到底是T(是)或F(否)默认状态下为F,则会逐列进行生成矩阵,如mat2_by_row;如果是T,则会逐行生成矩阵

mat2_by_col = matrix(df,nrow = 4)
mat2_by_row = matrix(df,nrow = 4,byrow = T)
mat2_by_col
            [,1]      [,2]      [,3]      [,4]       [,5]
[1,]  1.51572303 -9.009337 -8.069651 -6.339988  2.5197964
[2,] -0.45631803 -5.252294 -2.816244 -4.567575  4.1924744
[3,]  0.92141092  3.952301 -3.641633 -2.487299 -9.9219402
[4,] -0.03206002  7.946048  9.163648  3.058989  0.6983358
mat2_by_row
          [,1]      [,2]       [,3]        [,4]       [,5]
[1,]  1.515723 -0.456318  0.9214109 -0.03206002 -9.0093368
[2,] -5.252294  3.952301  7.9460477 -8.06965130 -2.8162442
[3,] -3.641633  9.163648 -6.3399880 -4.56757486 -2.4872986
[4,]  3.058989  2.519796  4.1924744 -9.92194021  0.6983358
2.3 类似于面包切片似的矩阵切片

有时候我们只需要矩阵中的一列、连续几列与特定几列,那么我们应该怎么做呢?这时我们就需要像切面包一样,对矩阵进行竖向切片。

图2 矩阵切片示例
提取矩阵中的第一列,单列提取后mat_v1为向量
mat_v1 = mat2_by_col[,1]

提取矩阵中的第1-3列

mat_v123 = mat2_by_col[,1:3]

提取矩阵中的第2和第4列

mat_v24 = mat2_by_col[,c(2,4)]

以上是单纯提取列的提取方法,提取行的方法与其类似,只需要把相应的中括号逗号之后的内容移到逗号前就可以实现。那么新问题又出来了,如何同时提取行与列(图3)?

图3 如何同时提取矩阵中的行与列?
提取矩阵中由a,b,c,d组成的2✖️2矩阵
mat_vh = mat2_by_col[2:3,2:3]

3. R语言数据变量存储方式三之数据框(data.frame)

3.1 data.frame的生成方式1-由矩阵进行转化
df1 = as.data.frame(mat2_by_col)
df1
           V1        V2        V3        V4         V5
1  1.51572303 -9.009337 -8.069651 -6.339988  2.5197964
2 -0.45631803 -5.252294 -2.816244 -4.567575  4.1924744
3  0.92141092  3.952301 -3.641633 -2.487299 -9.9219402
4 -0.03206002  7.946048  9.163648  3.058989  0.6983358
3.2 data.frame的生成方式2-data.frame函数生成
df2 = data.frame(V1 = 1:4,
                 V2 = 5:8,
                 V3 = 9:12,
                 V4 = 13:16,
                 V5 = 17:20)
df2
  V1 V2 V3 V4 V5
1  1  5  9 13 17
2  2  6 10 14 18
3  3  7 11 15 19
4  4  8 12 16 20
3.3 data.frame的切片与增加方式

data.frame 除了可以像矩阵matrix一样方式的切片之外,data.frame还有自己的一套索引方法,即根据列名进行索引。

V1 = df2$V1
V1
[1] 1 2 3 4

此外,data.frame 还可以通过“$”符号进行列的增加,注意必须与其他列的长度一样!

df2$V6 = 21:24
df2
  V1 V2 V3 V4 V5 V6
1  1  5  9 13 17 21
2  2  6 10 14 18 22
3  3  7 11 15 19 23
4  4  8 12 16 20 24

4. R语言数据变量存储方式四之列表(list)

如果说矩阵(matrix)与数据框(data.frame)可以装字符,数字,数字与字符混装之外,列表(list)较其功能来讲来说就像多来A梦的兜子一样,什么都可以装,什么矩阵啊,数据框啊,函数啊,我们地理中经常用到的Raster 文件啊,都可以装!!而且不光可以装同类的,还可以混装不同类的数据,你就说厉不厉害!!


4.1 往list中装货
list1 = list(fighting_for_wuhan, mat2_by_col, df2)
list1
[[1]]
function () 
{
    return("Fighting!! WUHAN")
}
<bytecode: 0x119344590>

[[2]]
            [,1]      [,2]      [,3]      [,4]       [,5]
[1,]  1.51572303 -9.009337 -8.069651 -6.339988  2.5197964
[2,] -0.45631803 -5.252294 -2.816244 -4.567575  4.1924744
[3,]  0.92141092  3.952301 -3.641633 -2.487299 -9.9219402
[4,] -0.03206002  7.946048  9.163648  3.058989  0.6983358

[[3]]
  V1 V2 V3 V4 V5 V6
1  1  5  9 13 17 21
2  2  6 10 14 18 22
3  3  7 11 15 19 23
4  4  8 12 16 20 24
4.2 从list中取货

list中取货需要用双中括号加变量在list中的编号。如:

list1_fun = list1[[1]]
 list1_fun
function(){
  return("Fighting!! WUHAN")
}
<bytecode: 0x119344590>
list1_mat = list1[[2]]
list1_mat
            [,1]      [,2]      [,3]      [,4]       [,5]
[1,]  1.51572303 -9.009337 -8.069651 -6.339988  2.5197964
[2,] -0.45631803 -5.252294 -2.816244 -4.567575  4.1924744
[3,]  0.92141092  3.952301 -3.641633 -2.487299 -9.9219402
[4,] -0.03206002  7.946048  9.163648  3.058989  0.6983358
list1_df = list1[[3]]
list1_df
  V1 V2 V3 V4 V5 V6
1  1  5  9 13 17 21
2  2  6 10 14 18 22
3  3  7 11 15 19 23
4  4  8 12 16 20 24

5. 总结

本篇主要解决了以下几个问题:

  1. 如何正确创建,保存及链接程序到Rstudio?
  2. 如何创建并切片Matrix?
  3. 如何创建并切片Data.frame?
  4. 如何往List中装货与卸货?

6. 致谢

首先,感谢大家的持续关注,小编会继续努力,持续更新下去的!

大家如果觉得有帮助啊,还麻烦大家关注点赞,也可以扩散到朋友圈,多多引导朋友加入咱们这个简书技术平台, 代码共享推动科研进程, 多谢大家啦~

大家如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~

祝大家身体健康,多多保重!!

小编联系方式

7. 号外:技术公众号【TheWhoOPs】上线啦~~

为了方便大家的阅读方便,技术公众号【TheWhoOPs】已经上线啦!!欢迎大家关注及转发哈,感谢大家鼎力支持!!


上一篇下一篇

猜你喜欢

热点阅读