与R中的下一行比较后,更改一行中的值

时间:2014-10-08 21:56:33

标签: r

我有一个数据框如下

Position  Chr     Score
10101   chr1        0   
4509    chr1        3.58051     
10745   chr1        0
2344    chr1        0
7165    chr1        -2.59335    
6752    chr1        -2.655688   
7441    chr1        0   
7588    chr1        -4.022041   
10671   chr1        0   

如果z分数具有非零值,我想仅在前一个值为零或在不同方向上非零时(即正或负)将其转换为零。

对于上述内容,我希望数据集最终看起来如下:

Position  Chr     Score
10101   chr1        0   
4509    chr1        0
10745   chr1        0
2344    chr1        0
7165    chr1        -2.59335    
6752    chr1        -2.655688   
7441    chr1        0   
7588    chr1        0
10671   chr1        0   

我想我需要一个应用功能,但我不知道如何使用它。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

所以我知道这看起来有点笨重,但它是一个矢量化(某种)解决方案,所以就是这样。从技术上讲,你也可以在一行中完成这一切,但那就是一线了!

首先设置要比较的不同矢量,"测试"将是我的分数列的复制

test<-c(0,3,0,0,-2,-2,0,-4,0)
#elements higher than element i, where i is between 2 and length(test)-1
higher<-test[3:length(test)]
#elements lower than element i, same definition as above
lower<-test[1:(length(test)-2)]
#our ith elements
mid<-test[2:(length(test)-1)]

然后我们可以通过ifelse

立即重置中间位置
#if i-1 != 0 and i-1 has the same sign as i, we keep i, else 0
newscore<-ifelse((lower!=0)&(sign(lower)==sign(mid)),mid, 0)
#[1]  0  0  0 -2 -2  0  0

然后在放入评论时将端点设置为0,并重置分数

newscore<-c(0,newscore, 0)
#[1]  0  0  0  0 -2 -2  0  0  0
df$Score<-newscore

这里是上面提供的ifelse的替代方法,它保留所有连续数字的相同符号

newscore<-ifelse((lower!=0), ifelse(((sign(lower)==sign(mid))), mid, 0),
    ifelse(sign(higher)==sign(mid), mid, 0))

以及使用以下测试向量运行所有以前的代码时

test<-c(0,3,4,5,0,0,2,2,2,0)

和替代ifelse结果是

#[1] 0 3 4 5 0 0 2 2 2 0