R语言学习笔记--列表list、数据框

列表

1-列表

列表可以包含不同类型的对象,也就是说,列表不是将某些具体的值组织起来,而是组织R对象。列表将数据组织在一个一维集合中。

列表非常好用,因为它可以装任何类型的对象,不要求数据之间是同质的。

创建列表

list()

> list1 <- list(100:130, "R", list(TRUE, FALSE))
> list1
[[1]]
 [1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
[18] 117 118 119 120 121 122 123 124 125 126 127 128 129 130

[[2]]
[1] "R"

[[3]]
[[3]][[1]]
[1] TRUE

[[3]][[2]]
[1] FALSE

 以上代码,创建了一个列表,其中第一个元素是一个长度为31的数值型向量,第二个元素是一个长度为1的字符串,而第三个元素是一个长度为2的新列表。list函数创建列表的方式与c函数创建向量的方式相似,不同的元素使用逗号分开。

解释上述的输出结果:双中括号索引,如[[1]]表示展示的内容来自列表的第一个元素。单中括号索引,表示在其之后显示的内容来自列表某元素的哪一个子元素。例如,100是该列表抵押给元素的第一个子元素。"R"是列表第二个元素的第一个子元素。

2-从列表中提取成分的内容

列表中的每个成分是一个对象,比如向量、数据框、矩阵、列表

  1.  使用$,通过成分名字来提取该成分下的内容;
  2. 使用双括号,例如[[n]]来提取第n个成分的内容。这里n可以是索引或者成分名字。

以下是具体的例子:

> lst <- list(numbers = c(1,2), logical = TRUE, strings = c("a", "b", "c"))
> lst
$numbers
[1] 1 2

$logical
[1] TRUE

$strings
[1] "a" "b" "c"

> lst[[1]]
[1] 1 2
> lst$numbers
[1] 1 2

3-提取列表子集

列表子集:从列表中提取多个成分及内容,得到的是列表,可以使用一个括号[ ]来提取列表子集。在[ ]中可以用字符向量表示成分名称,用数值向量表示成分位置, 或者用逻辑向量指定是否选择来提取列表成分。

> lst <- list(numbers = c(1,2), logical = TRUE, strings = c("a", "b", "c"))
> lst
$numbers
[1] 1 2

$logical
[1] TRUE

$strings
[1] "a" "b" "c"
> lst[1]
$numbers
[1] 1 2

数据框-data.frame

1-数据框

数据框可以看作类似是EXCEL表,各列数据类型允许不同,每一列数据类型相同。在R中数据框那个是特殊的列表,其每个列表元素都是一个长度相同的向量

函数data.frame()可以生成数据框,只适合小数据场景,数据量比较大的时候,建议将数据导入到R中。

> d <- data.frame(
+   name=c("李明", "张聪", "王建"),
+   age=c(30, 35, 28),
+   height=c(180, 162, 175),
+   stringsAsFactors=FALSE)
> print(d)
  name age height
1 李明  30    180
2 张聪  35    162
3 王建  28    175

 data.frame()函数会将字符型列转换成因子,加选项stringsAsFactors=FALSE可以避免这样的转换。

2-数据框内容访问

访问第二列,是一个向量:d[[2]],d[["age"]], d[,2], d[, "age"] (注:后面两种做法与tibble不兼容,应避免使用)

> d[,"age"]
[1] 30 35 28
> d[[2]]
[1] 30 35 28
> d[["age"]]
[1] 30 35 28
> d[,2]
[1] 30 35 28
> d[,"age"]
[1] 30 35 28

访问数据框的第二个元素,此时把数据框当作列表来看,返回的结果仍是一个数据框。

> d[2]
  age
1  30
2  35
3  28
> d["age"]
  age
1  30
2  35
3  28
> class(d[2])
[1] "data.frame"

数据框-tibble

数据框-tibble

数据框是一个随着R语言前身S语言继承下来的概念,现在已经有一些不足之处,tibble包提供了tibble类,这是数据框的一个改进版本。

Hadley在tibble包中引入了一种tibble数据框,以代替data.frame,并且tidyverse包都是基于tibble数据框的。

创建数据框tibble,注只适应于数据量比较小的情况。

  1. 若干列向量创建tibble;
  2. 按行录入数据的方式创建tibble。
> t.bp <- tibble(
+   `序号`=c(1,5,6,9,10,15),
+   `收缩压`=c(145, 110, "未测", 150, "拒绝", 115))
> t.bp
# A tibble: 6 × 2
   序号 收缩压
    
1     1 145   
2     5 110   
3     6 未测  
4     9 150   
5    10 拒绝  
6    15 115   
> t.bp2 <- tribble(
+   ~`序号`,~`收缩压`,
+   1,145,
+   5,110,
+   6,NA,
+   9,150,
+   10,NA,
+   15,115
+ )
> t.bp2
# A tibble: 6 × 2
   序号 收缩压
    
1     1    145
2     5    110
3     6     NA
4     9    150
5    10     NA
6    15    115

注意:tribble() 中数据每行末尾也需要有逗号,最后一行末尾没有逗号。

tibble比数据框好的地方:

  1. tibble 与数据框的一大区别是在显示时不自动显示所有内容,这样可以避免显示很大的数据框将命令行的所有显示都充满。
  2. tibble 在生成或输入时不自动将字符型列转换为因子。

数据框内容访问:

双中括号,访问元素的内容;

单中括号,访问数据框子集。

> t.bp2[[1]]
[1]  1  5  6  9 10 15
> t.bp2[1]
# A tibble: 6 × 1
   序号
  
1     1
2     5
3     6
4     9
5    10
6    15

总结数据框和列表的访问:

由于数据框是特殊的列表,所以二者可以使用一套访问方法,即

  • 单中括号访问子集;
  • 双中括号访问元素内容;

参考:

  1. R语言入门与实践--冯凌秉译
  2. Rbook_PKU_李东风
  3. R语言编程-张敬信

你可能感兴趣的:(R编程练习,学习,笔记)