索引能够帮助我们从数据当中截取或去除特定的的部分,本文介绍在R中进行索引的常用规则,以及当我们只取data.frame的一列时,如何保持data.frame的格式。
在R中读取了或创建了一个数据集后,我们有时候会需要截取数据当中的一部分。这个时候如何准确地提取这部分特定的数据就成为了一个头疼的问题。幸好,R语言提供了强大的索引体系,以下我就展示一些常见的索引方法及例子吧!
索引方法
我们可以通过以下几种方式创建索引:
首先,我们创建以下的数据框进行演示
1 2 3 4 5 6 7 8
   | > name <- c("A", "B", "C") > score <- c(4, 7, 9) > df <- data.frame(name, score) > df   name score 1    A     4 2    B     7 3    C     9
  | 
 
接着,我们将通过不同的索引方法,提取其中的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | #正整数索引类似于(i,j)的索引方法 > df[1,1]    [1] A
  #负整数索引则是返回不包含负整数索引所对应的元素 > df[-1,1]    [1] B C
  #空格表示返回该索引对应维度的所有元素。 > df[1, ]     name score 1    A     4
  #也可以用待提取元素的名称作为索引值,但要双引号 > df[1, "name"] [1] A
  #逻辑值索引,相当于对该维度的每一位置进行逻辑判断后再进行提取。 > df[1, c(TRUE,FALSE)] [1] A
  #对于列/行有名称的情况,还可以用$索引某列/行 > df$score [1] 4 7 9
   | 
 
drop参数保持data.frame属性
如果想通过中括号取值后仍然返回数据框的格式,一种是提取的值包含多种类型的值。二是使用drop 参数:
1 2 3 4 5 6 7 8 9 10 11
   | > df[-1,1] [1] B C > class(df[-1,1]) [1] "factor"
  > df[-1,1, drop = FALSE]   name 2    B 3    C > class(df[-1,1, drop = FALSE]) [1] "data.frame"
   | 
 
list相关的subset
此外,在list中也有一些有意思的情况,但还是应当了解其索引的方法。list的元素可以通过双中括号[[]]和单中括号[]索引,两者有以下区别:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | list1 <- list(1:10, "a", list(TRUE, FALSE)) #双中括号返回的是列表中的子集元素 > list1[[1]]  [1]  1  2  3  4  5  6  7  8  9 10 > sum(list1[[1]]) [1] 55 > class(list1[[1]]) [1] "integer"
  #而单中括号返回的仍然是一个列表对象,R中许多函数不接受list对象 > list1[1] [[1]]  [1]  1  2  3  4  5  6  7  8  9 10 > sum(list1[1]) Error in sum(list1[1]) : invalid 'type' (list) of argument > class(list1[1]) [1] "list"
   | 
 
总而言之,使用双中括号索引列表时,可以实实在在地获得列表中的元素。而使用单中括号索引时,只是提取了一个子列表出来,返回的仍然是列表。
完。