jimshsu
我最近在进行大笔统计运算
但是数据必须先要进行QAQC
例如 10<A<30
有错的资料要用上一笔好的资料取代
我原先想到用for loop一个个判断
但是效能太差了
所以我想到用矩阵运算方式
Acheck<-if(abs(A-mean(10,30)) > 20)
但是只能获得一个True跟False的矩阵
而且尚无法取代坏的数据成为上一笔好的资料
不知各位板友是否有建议的方式?
yihui
没完全看懂你的意思,但通过逻辑向量或矩阵也是可以从一个数据框/矩阵中取值或者赋值的,这在R里面很容易实现,比如
> (x=matrix(1:10,,2)) #原始矩阵
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
> x>2 & x<7 #逻辑条件
[,1] [,2]
[1,] FALSE TRUE
[2,] FALSE FALSE
[3,] TRUE FALSE
[4,] TRUE FALSE
[5,] TRUE FALSE
> x[x>2 & x<7] #符合逻辑条件的值
[1] 3 4 5 6
> x[x>2 & x<7]=0 #对符合逻辑条件的值重新赋新值
> x #结果就成这样了
[,1] [,2]
[1,] 1 0
[2,] 2 7
[3,] 0 8
[4,] 0 9
[5,] 0 10
rtist
[quote]取代坏的数据成为上一笔好的资料[/quote]interesting.
there'd be many naive ways. But I didn't figure out how to do it most efficiently...
jimshsu
感谢版主提供了另一种方式,对R不是那么熟悉,所以没想到这种方式
我写的那种方式是参考Matlab的范例来的
困扰我的原因是这种QAQC的方式是要把不合标准的数据取代成他前一笔好的资料
例如
[,1]
[1,] 1
[2,] 8
[3,] 3
[4,] 10
[5,] 10
1< x < 7
要变成
[,1]
[1,] 1
[2,] 1
[3,] 3
[4,] 3
[5,] 3
甚至有一种情况是第一笔数据就不符标准
所以我得用for loop 先找到第一笔正确数据
再来做QAQC
dolbi
谢老师提供的是R里的routine methods.
如果数据量实在大,可以考虑用关系数据库.如mysql.
虽然我现在用mysql遇上点小问题.不过我的情况特殊一点.^_^
rtist
I cannot find any way better than a for loop...
rtist
I cannot see any advantage by using db in this case...
how do u do this in sql? better than a loop??
yihui
我也觉得没什么比循环更好的办法,不过对于数据量不大的情况,我也提供一个偷懒办法吧,利用rle()求出runs,这个run length对这里的问题很有帮助:
> (x=c(1,8,3,10,10,6,7,11))
[1] 1 8 3 10 10 6 7 11
> (cond = (1<=x & x<=7))
[1] TRUE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
> (rl=rle(cond)$lengths)
[1] 1 1 1 2 2 1
> x[!cond]=rep(x[cumsum(rl)[2*(1:floor(length(rl)/2))-1]], rl[2*(1:floor(length(rl)/2))])
> x
[1] 1 1 3 3 3 6 7 7
当然这里面有奇数偶数的问题,自己解决吧。只是我的一种想法。最长的那一句的意思是,找出“好资料”(根据每一笔连续好资料的最后一个),然后把“好资料”分别重复“‘坏资料’的个数”遍,最后替代相应的坏资料。
如果数据很大,还是直接用循环吧,没必要动歪脑筋:)循环的时候结合一下which()函数也许会让程序稍微简洁一点(比如for (i in which(!cond)){用好资料i-1替代坏资料i...})
最后冒汗问一句,QAQC究竟是啥玩意儿?质量控制?……
.
jimshsu
感谢谢老师回应
我来试试这方法
QA/QC(Quality control & Quality Assurance)是科学数据收取后要进行分析前必须进行的步骤,以便确保数据的质量