一、找出并去掉向量中的缺失值
--------------------------------
>a<-c(1,2,NA)
>b<-a[!is.na(a)]
>b
[1] 1 2
--------------------------------
二、找出并去掉矩阵中有缺失值的行
------------------------------------
> a
[,1] [,2] [,3]
[1,] 1 5 NA
[2,] 2 6 10
[3,] 3 NA 11
[4,] 4 8 12
> b<-which(is.na(a),arr.ind=TRUE)
> b
row col
[1,] 3 2
[2,] 1 3
> a<-a[-b[,1],]
> a
[,1] [,2] [,3]
[1,] 2 6 10
[2,] 4 8 12
----------------------------------------
which用来找缺失值的坐标,arr.ind=TRUE是必须的,不然默认是把对象当向量,返回的
就是把矩阵当作向量的这个序列里的位置,然后a[-b[,1],],负号表示要删除,b是一个
矩阵,第一列是缺失值行号。删除列就用a[,-b[,2]]。
三、实例
下载了上证A股10年的个股月收益率,列为股票,行为时间(月),缺失值有两种情况,
一是期初还未发行,自然无数据;二是非正常缺失,包括长期停牌或者退市。目标是将
出现第二种情况的股票剔除。按以下步骤操作:
1.a为原始data.frame,首先对期初已发行的股票进行筛选
b<-a[,which(!is.na(a[1,]))]#第一期缺失的先不考虑
c<-which(is.na(b),arr.ind=TRUE)
d<-unique(c[,2])#提取有缺失值的列
e<-colnames(b)[d]#这些列的股票代码
f<-match(e,colnames(a))#这些代码在原始data frame里的列位置
a<-a[,-f]#删掉这些列
2.a现在去掉了期初已上市股票中有缺失值的,开始对期初未发行的股票进行筛选
b<-a[,which(is.na(a[1,]))]#选择第一期缺失的
#由于这些股票从期初开始就有缺失,而要判断的是他们在序列中或者末是否有缺失,
#考虑以下方法筛选:当缺失值的最大位置大于缺失值数时,说明缺失值不是只有从
#期初开始的一串连续缺失,继而判定该列应该被删除。
n<-numeric(0)#设定一个向量来存放要删除的列号
for(i in 1:dim(b)[2])
{
ti<-max(which(is.na(b[,i])))-length(which(is.na(b[,i])))
if(ti>0){
n<-c(n,i)
}
}
m<-colnames(b[,n])
f<-match(m,colnames(a))#这些代码在a里的列号
a<-a[,-f]#删掉这些列
------------------------------------------------
现在的a就是去掉了有缺失值股票的数据了。
wow~~~
更新啦~~