如何根据逻辑列的条件从数字列转发填充

时间:2019-08-27 21:26:36

标签: r dplyr

我有一列pdf值和一个条件列。我试图创建第三列,以根据条件列向前填充pdf列中的值。如果条件为<div id="mySidePanelTableA" class="sidePanelTableA"> <a href="javascript:void(0)" class="closebtn" onclick="closePanelTableA()" > &times; </a> <br /><br /> TITLE <br /><br /> <img src="tableA.jpeg" height="200px" /> </div> <button onclick="openPanelTableA()">Open</button>,那么我希望相应的行从头开始重新启动pdf列。

我已经看到这个问题发布在R: fill new columns in data.frame based on row values by condition?上,并且已经很接近了,但是我希望使用dplyr解决方案来保留我的管道结构。

非常简单的示例数据:

TRUE

预期在上面的数据框中可见。 (请注意,我没有看到library(tidyverse) dat <- tibble(pdf = c(.025, .05, .10, .15, .175, .20, .29, .01), cond = c(F, F, T, F, F, F, T, F), expected = c(.025, .05, .025, .05, .10, .15, .025, .05)) 列)

谢谢。

1 个答案:

答案 0 :(得分:4)

这是一种使用ave创建引用的方法。

cumsum(cond)的输出产生一个分组,ave使用该分组,并使用seq_along沿每个组创建一个序列。然后将此序列用作提取适当的pdf值的参考。

dat %>% 
  mutate(
    ref = ave(pdf, cumsum(cond), FUN = seq_along),
    expected2 = pdf[ref]
  )

# A tibble: 8 x 5
    pdf cond  expected   ref expected2
  <dbl> <lgl>    <dbl> <dbl>     <dbl>
1 0.025 FALSE    0.025     1     0.025
2 0.05  FALSE    0.05      2     0.05 
3 0.1   TRUE     0.025     1     0.025
4 0.15  FALSE    0.05      2     0.05 
5 0.175 FALSE    0.1       3     0.1  
6 0.2   FALSE    0.15      4     0.15 
7 0.290 TRUE     0.025     1     0.025
8 0.01  FALSE    0.05      2     0.05