我有一个数据框如下
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
我想我需要一个应用功能,但我不知道如何使用它。有人可以帮忙吗?
答案 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