我有一列pdf值和一个条件列。我试图创建第三列,以根据条件列向前填充pdf列中的值。如果条件为<div id="mySidePanelTableA" class="sidePanelTableA">
<a
href="javascript:void(0)"
class="closebtn"
onclick="closePanelTableA()"
>
×
</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))
列)
谢谢。
答案 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