保留前一行的数据帧的条件子集

时间:2016-05-03 17:05:15

标签: r subset

我的数据框架如下所示

       Model           w0        p0          w1          p1       w2      p.value

1   Null_model 3.950000e-05 0.7366921 0.988374029 0.000000e+00 1.296464 
2     alt_test 1.366006e-02 0.4673263 0.139606503 3.049244e-01 1.146653 
3     alt_ref  2.000000e-07 0.4673263 0.000846849 3.049244e-01 1.635038  5.550000e-15 

8   Null_model 2.790000e-05 0.7240479 0.987016439 0.000000e+00 1.263556  
9     alt_test 7.550000e-09 0.7231176 0.991768899 1.060000e-13 1.369259   
10     alt_ref 2.770000e-05 0.7231176 0.995373167 1.060000e-13 1.192839  3.073496e-01

            ...      ...          ...         ...          ...       ...        ...

我想要的是以data.frame的方式对我的p.value < 0.05进行子集化,同时保留前一行到这些情况。

理想情况下,我的输出将是这样的

      Model       w0          w1       w2
2   alt_test  1.4e-0.2 0.139606503 1.146653
3   alt_ref   2.00e-07 0.000846849 1.635038

我已经尝试了以下但是它没有做得很好:

  

子集(v,p.value&lt; 0.05,select = c(Model,w0,w1,w2))

输出没有alt_test行。

我也试过

  

with(v,ifelse(p.value&lt; 0.05,paste(dplyr :: lag(c(w0,w1,w2),1)),&#34;&#34;))

,这种情况下的输出看起来像

  [1] NA            NA            NA            NA            "0.013660056" NA            NA            NA            NA            ""           
 [11] NA            NA            NA            NA            ""            NA            NA            NA            NA            ""           
 [21] NA            NA            NA            NA            ""            NA            NA            NA            NA            ""           
 [31] NA            NA            NA            NA            ""            NA            NA            NA            NA            ""           
 [41] NA            NA            NA            NA            ""            NA            NA            NA            NA            ""           
 [51] NA            NA            NA            NA            "1.34e-11"    NA            NA            NA            NA            ""    ...       

我也试过

  

子集(v,p.value&lt; 0.05,select = c(w0,w1,w2,w0-1,w1-1,w2-1))

但是这给了前一列,所以我想知道类似的东西是否可以给出以前的行呢?

谢谢

1 个答案:

答案 0 :(得分:0)

如果您的data.frame始终具有alt_testalt_ref的交替结构,那么您可以手动构建子集索引,如下所示:

library(data.table)
setDT(myDf)
myDf[Reduce(function(x,y) ifelse(!is.na(x), x, ifelse(!is.na(y), y, F)),
     shift(p.Value < 0.05, n = 0:1, type = "lead")), .(Model,w0,w1,w2)]