我正在尝试做一些类似滞后的事情,但是跨越而不是群体内部。样本数据:
df <- data.frame(flag = c("A", "B", "A", "B", "B", "B", "A", "B", "B", "A", "B"),
var = c("AB123","AC124", "AD125", "AE126",
"AF127", "AG128", "AF129",
"AG130","AH131",
"AHI132", "AJ133"))
)
每个旗帜的目标=&#34; B&#34;是用以前的var值创建lagvar,其中flag =&#34; A&#34;。
这将显示所需的输出:
df1 <- data.frame(flag = c("A", "B", "A", "B", "B", "B", "A", "B", "B", "A", "B"),
var = c("AB123","AC124", "AD125", "AE126",
"AF127", "AG128", "AF129",
"AG130","AH131",
"AHI132", "AJ133"),
lagvar = c("","AB123","","AD125","AD125","AD125","","AF129","AF129","","AHI132")
)
首选dplyr解决方案,但我不挑剔!
编辑:我找到了一个使用动物园套餐的解决方案,但是如果其他人有更好的想法我很感兴趣。df$lagvar <- ifelse(df$flag == "A", df$var, NA)
df <- df %>%
mutate(lagvar = na.locf(lagvar)
答案 0 :(得分:4)
你走了。我使用了NA
而不是空格,但您可以根据需要进行调整:
df %>% mutate(lagvar = ifelse(flag == "A", as.character(var), NA),
lagvar = zoo::na.locf(lagvar),
lagvar = ifelse(flag == "A", NA, lagvar))
# flag var lagvar
# 1 A AB123 <NA>
# 2 B AC124 AB123
# 3 A AD125 <NA>
# 4 B AE126 AD125
# 5 B AF127 AD125
# 6 B AG128 AD125
# 7 A AF129 <NA>
# 8 B AG130 AF129
# 9 B AH131 AF129
# 10 A AHI132 <NA>
# 11 B AJ133 AHI132
答案 1 :(得分:0)
我的解决方案有点复杂。我们的想法是找出每个B应该分配的A的位置,然后用一个表连接,该表只包含带有标志A的行。
df %>%
mutate(pos=cumsum(flag == "A")) %>%
left_join(
df %>%
filter(flag == "A") %>%
mutate(pos=1:n()) %>%
select(pos, lagvar=var),
by="pos") %>%
mutate(lagvar=ifelse(flag == "A", "", as.character(lagvar)))
# flag var pos lagvar
# 1 A AB123 1
# 2 B AC124 1 AB123
# 3 A AD125 2
# 4 B AE126 2 AD125
# 5 B AF127 2 AD125
# 6 B AG128 2 AD125
# 7 A AF129 3
# 8 B AG130 3 AF129
# 9 B AH131 3 AF129
# 10 A AHI132 4
# 11 B AJ133 4 AHI132