Условное подмножество фрейма данных с сохранением предыдущей строки

Мой фрейм данных выглядит так

       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 < 0,05, select = c(модель,w0,w1,w2))

вывод не имеет строки alt_test.

Я также пытался

с (v, ifelse(p.value < 0,05, вставьте (dplyr::lag(c(w0,w1,w2),1)), ""))

и вывод в этом случае выглядит

  [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 < 0,05, select = c(w0, w1,w2, w0-1, w1-1, w2-1))

но это дает предыдущий столбец, поэтому мне было интересно, если что-то подобное может дать вместо предыдущих строк?

Спасибо

1 ответ

Решение

Если ваш data.frame всегда имеет чередующуюся структуру как alt_test а также alt_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)]
Другие вопросы по тегам