R语言中的数据筛选索引

data_select

Xiaojia Zhang

R中数据筛选方法综述

利用整数下标形式索引

x=c(1:10)
x

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

x[4]

## [1] 4

x[1:3]

## [1] 1 2 3

x[-3]

## [1]  1 2  4  5 6  7  8  9 10

x[-c(1:3)]

## [1]  4 5  6  7 8  9 10

y=c(1:20)
dim(y)=c(4,5)
y

##      [,1] [,2] [,3] [,4] [,5]
## [1,]   1    5    9  13   17
## [2,]   2    6   10  14   18
## [3,]   3    7   11  15   19
## [4,]   4    8   12  16   20

y[2,3]

## [1] 10

y[-1,-1]

##      [,1] [,2] [,3] [,4]
## [1,]   6   10   14  18
## [2,]   7   11   15  19
## [3,]   8   12   16  20

y[1:2,1:2]

##      [,1] [,2]
## [1,]   1    5
## [2,]   2    6

y[-c(1,2),-c(1:2)]

##      [,1] [,2] [,3]
## [1,]  11   15   19
## [2,]  12   16   20

利用列名索引

x=c(1:5)
y=2*x
z=cbind(x,y)
z

##      x y
## [1,] 1 2
## [2,] 2 4
## [3,] 3 6
## [4,] 4 8
## [5,] 5 10

z[1,"x"]

## x
## 1

z[1,1]

## x
## 1

z[,"y"]

## [1]  2 4  6  8 10

z[1,c("x","y")]

## x y
## 1 2

z[,c("x","y")]

##      x y
## [1,] 1 2
## [2,] 2 4
## [3,] 3 6
## [4,] 4 8
## [5,] 5 10

利用逻辑向量索引

在利用逻辑向量索引时,R将查找逻辑值为TRUE元素的下标,并索引该下标元素的值,而不包括FALSE的值

x=c(1:10)
set.seed(1)
s=sample(c(TRUE,FALSE),10,replace = TRUE)
x

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

s

##  [1] TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE

x[s]

## [1]  1 2  5 10

!s

##  [1] FALSE FALSE  TRUE TRUE FALSE  TRUE  TRUE TRUE  TRUE FALSE

x[!s]

## [1] 3 4 6 7 8 9

利用条件表达式,实质上也是利用逻辑向量

注意到,所有关于向量的表达式返回的均是逻辑向量

set.seed(1)
x=sample(1:100,10,replace = FALSE)
x

##  [1] 27 37 57 89 20 86 97 62 58  6

#有关向量的表达式返回的均是逻辑向量
y=(x>30)
y

##  [1] FALSE TRUE  TRUE  TRUE FALSE TRUE  TRUE  TRUE TRUE FALSE

x[x>30]

## [1] 37 57 89 86 97 62 58

x[y]

## [1] 37 57 89 86 97 62 58

#!y表示将y这一逻辑向量翻转,TRUE变为FALSE,FALSE变为TRUE, 与之对应的是在整数索引中,我们用的‘-’,如x[-c(1:3)]
x[!y]

## [1] 27 20  6

#which函数返回表达式逻辑向量中TRUE的索引,
which(x>30)

## [1] 2 3 4 6 7 8 9

x[which(x>30)]

## [1] 37 57 89 86 97 62 58

x[-which(x>30)]

## [1] 27 20  6

其他例子

#对于具有很多列的数据框,只排除其中较少的列,该如何通过列名来实现
x=c(1:5)
y=2*x
z=c("January","February","March","April","May")
S=data.frame(x,y,z)
S

##   x y        z
## 1 1 2  January
## 2 2  4February
## 3 3 6    March
## 4 4 8    April
## 5 5 10     May

names(S)=c("fir","sec","thi")
#选择不包括“thi”列的数据,
delete_=names(S)%in% c("thi")
delete_

## [1] FALSE FALSE  TRUE

S[c("fir","sec")]

##   fir sec
## 1  1   2
## 2  2   4
## 3  3   6
## 4  4   8
## 5  5  10

S[!delete_]

##   fir sec
## 1  1   2
## 2  2   4
## 3  3   6
## 4  4   8
## 5  5  10

利用subset选择数据

set.seed(1)
age=sample(18:60,15,replace=TRUE)
salary=sample(3000:12000,15,replace = TRUE)
age

##  [1] 29 34 42 57 26 56 58 46 45 20 26 25 47 3451

salary

##  [1] 7479  9459 11928  6420 9997 11413  4909  8865 4130  5405  6475
## [12] 3120  6441 10828  6063

people=data.frame(age,salary)
people

##    age salary
## 1  29   7479
## 2  34   9459
## 3  42  11928
## 4  57   6420
## 5  26   9997
## 6  56  11413
## 7  58   4909
## 8  46   8865
## 9  45   4130
## 10 20   5405
## 11 26   6475
## 12 25   3120
## 13 47   6441
## 14 34  10828
## 15 51   6063

people[age>25&age<45,"salary"]

## [1]  7479 9459 11928  9997  6475 10828

people_select=subset(people,age>25&age<45,c("age","salary"))
people_select

##    age salary
## 1  29   7479
## 2  34   9459
## 3  42  11928
## 5  26   9997
## 11 26   6475
## 14 34  10828

综合应用

问题一,已知一个向量X,要求将该向量随机地划分为两个长度相等的向量(假设向量长度为偶数)
问题二,已知一个向量,要求将该向量随机地划分为两个向量,并且两个向量的长度也是随机的

#对于问题一,涉及到随机问题,我们可考虑利用sample()函数来产生随机数,即随机的不放回地产生该向量的索引,并用该索引数构成的向量来划分向量
set.seed(1)
x=c(1:20)
index=sample(1:length(x),length(x)/2,replace = FALSE)
index #索引向量

##  [1] 6  8 11 16  4 14 15 9 19  1

x1=x[index]
x1

##  [1] 6  8 11 16  4 14 15 9 19  1

x2=x[-index]#在索引向量前加‘-’,表示返回这些索引的元素值
x2

##  [1] 2  3  5  7 1012 13 17 18 20

#对于问题二,由于要求向量分割长度随机,因此考虑每一个索引值是否选择也应该是随机的情况,这种情况的话通过整数索引难以实现,但我们可以利用逻辑向量的方式轻松实现这一点,注意此时产生的随机数是决定向量中每一个元素是否被选择的逻辑值TRUEorFALSE,所以应采用又放回抽样
luoji=sample(c(TRUE,FALSE),length(x),replace = TRUE)
luoji

##  [1] TRUE  TRUE FALSE  TRUE FALSE TRUE FALSE FALSE  TRUE FALSE FALSE
## [12] TRUE FALSE  TRUE  TRUE TRUE  TRUE  TRUE FALSE TRUE

x1=x[luoji]
x1

##  [1] 1  2  4 6  9 12 14 15 16 17 18 20

x2=x[!luoji]
x2

## [1]  3 5  7  8 10 11 13 19

猜你喜欢

转载自blog.csdn.net/zhangxiaojiakele/article/details/53959400