Advertisement

R语言自学笔记:向量、矩阵及dataframe基础

阅读量:

概要

记录一下在学习和练习过程中所遇到的一些细节问题


一. 向量

1.向量的基础

(1)R语言中,向量元素从一开始标号,vector[0] 用于储存向量的类型

(2)向量的嵌套,在R语言中向量之间是可以以嵌套的形式来指定对应元素,例如:

复制代码
 x <- c(2, 4, 6, 8)

    
 y <- c(TRUE, TRUE, FALSE, TRUE)
    
 print(x[y])

结果为:

复制代码
 > print(x[y])

    
 [1] 2 4 8

(3)选取向量的部分。除了基本的可以使用数字坐标来选择向量的部分 ,也可以如上,在[ ]内输入对应坐标构成的向量来一口气选择多个目标:

复制代码
 > m[c(1,4,5)]

    
 [1] "1" "5" "6"

2.向量的计算

(1)四则运算

在R语言里向量的基本计算与大多数语言的规则相同,所有的运算法针对于每一个单独的元素来进行,甚至包括逻辑运算符,例如:

复制代码
 p <- c(1,2,3)

    
 p+3

所得的结果为:

复制代码
    [1] 4 5 6

比较通俗易懂。

(2)向量之间的运算

维度相同的向量可以直接地在对应的位置进行运算。针对维度不同的向量,运算会采取类似于循环处理的方法:

复制代码
 p <- c(4,5,6,7)

    
 q <- c(2,3,4)
    
 p/q
    
 q/p

所得结果为:

复制代码
 > p/q

    
 [1] 2.000000 1.666667 1.500000 3.500000
    
 Warning message:
    
 In p/q : longer object length is not a multiple of shorter object length
    
 > q/p
    
 [1] 0.5000000 0.6000000 0.6666667 0.2857143
    
 Warning message:
    
 In q/p : longer object length is not a multiple of shorter object length

二.矩阵

1.矩阵的基础

(1)对于一个矩阵,matrix[0,0]储存了表示变量为矩阵的表示,打印出来的为:

复制代码
    <0 x 0 matrix>

第0行和第0列分别储存了的矩阵的行名和列名,由[0,]和[,0]调用出来。但需要注意的是,matrix[0,x]和matrix[0]储存的仍然是每一列(向量)的数据类型。

(2)创建矩阵时,若元素无法被规定的行数和列数整除或者无法填满目标大小的矩阵,则元素会自动地进行重复,填满矩阵为止:

复制代码
 > m <- matrix(1:7,nrow=3)

    
 Warning message:
    
 In matrix(1:7, nrow = 3) :
    
   data length [7] is not a sub-multiple or multiple of the number of rows [3]
    
 > m
    
      [,1] [,2] [,3]
    
 [1,]    1    4    7
    
 [2,]    2    5    1
    
 [3,]    3    6    2

此为R语言的特色之一,在dataframe中也应用同样的规则。

(3)选中某行并进行操作。R语言中,可以通过数字坐标以及行名和列名选择矩阵中的某个元素或某行。对于选中的行列可以直接用 <- 来赋值以达到替换的目的。

三. dataframe

1.dataframe 基础

(1)表头的创建方法

复制代码
    df2 <- data.frame( x = character(), y = integer(), z = double() , stringsAsFactors = FALSE );

(2)dataframe的创建方法

基本的方法是使用data.frame() 这个函数来创建,在括号中依次输入列向量即可,若向量的已经进行了每个元素的命名,则会直接成为dataframe的row_name。

(3)表的合并

可以用cbind和rbind函数分别依照列和行对dataframe进行合并。当变量行数不同时,采取自动填充的规则;变量的列数或列名不同时,会直接接报错:

复制代码
 df4 <- data.frame( data = 1:10, group = c("A","B") );

    
 df6 <- data.frame( length = sample(1:100, 5), width = sample(1:100, 5) );
    
 df7 <- cbind(df4,df6)
    
 df5 <- data.frame( data = 1)
    
 df8 <- rbind(df4,df5)
    
 df7

运行结果:

复制代码
 > df4 <- data.frame( data = 1:10, group = c("A","B") );

    
 > df6 <- data.frame( length = sample(1:100, 5), width = sample(1:100, 5) );
    
 > df7 <- cbind(df4,df6)
    
 > df5 <- data.frame( data = 1)
    
 > df8 <- rbind(df4,df5)
    
 Error in rbind(deparse.level, ...) : 变量的列数不对
    
 > df7
    
    data group length width
    
 1     1     A      2    87
    
 2     2     B     61    54
    
 3     3     A     82    47
    
 4     4     B     21    32
    
 5     5     A     35    17
    
 6     6     B      2    87
    
 7     7     A     61    54
    
 8     8     B     82    47
    
 9     9     A     21    32
    
 10   10     B     35    17

(4)dataframe的 [0,x]储存每一列的数据类型,而一旦x为一个向量,eg.1:3 ,输出变为对应位置的行名字。

(5)在R语言里默认行为个体,列为不同属性。

(6)一种删除某个变量的方法,直接令dataframe的某一列为NULL

2.tibble

(1) tibble相当于dataframe的升级版,由tibble这个包来提供。其创建方法同dataframe,由tibble() 直接完成;

(2)tibble表头创建:

复制代码
 tb <- tibble( x = character(), y = integer(), z = double() );

    
 dim(tb);
    
  
    
  
    
 ## [1] 0 3

注意维度的结果;

(3)可以使用add_row() 函数向tibble里面添加行,但tibble本身不能直接插入到另一个tibble里面;完成tibble的合并可以使用bindrow()函数,同理到列相关的函数。

(4)tibble与dataframe的不同:

其一:

tibble evaluates columns sequentially

复制代码
  
    
 rm(x,y); ## 删除可能存在的 x , y
    
 tibble(x = 1:5, y = x ^ 2); ## 可以用 tibble 这样做
    
 ## # A tibble: 5 x 2
    
 ## x y
    
 ## <int> <dbl>
    
 ## 1 1 1
    
 ## 2 2 4
    
 ## 3 3 9
    
 ## 4 4 16
    
 ## 5 5 25
    
  
    
  
    
 data.frame(x = 1:5, y = x ^ 2); ## 但 data.frame 不行
    
 ## Error in data.frame(x = 1:5, y = x^2): 找不到对象'x'

其二:

取部分时,tibble的部分永远是tibble,而dataframe的部分可能是dataframe或向量(取单行时);

其三:

tibble循环时,仅长度为1或登场时可以进行循环,对于例如3个元素需要填充4行的情况会判定失败;

其四:

dataframe在取某一列时,输入列的名可以进行局部匹配,从而找到对应列,而tibble不行。

3.读取和写入

(1)使用到readr这个包,类似于python中的pandas这个包,内含有read_csv()等函数。在读取时还可以预设读取时所采取的数据形式:

复制代码
 myiris2 <- read_csv("data/talk03/iris.csv", col_types = cols(

    
 Sepal.Length = col_double(),
    
 Sepal.Width = col_double(),
    
 Petal.Length = col_double(),
    
 Petal.Width = col_double(),
    
 Species = col_character()
    
 ));

写入的例子:

Comma delimited file: write_csv (x, path, na = “NA”, append = FALSE, col_names = !append)

全部评论 (0)

还没有任何评论哟~