R-根据id填充空白值

R-根据id填充空白值,r,dplyr,R,Dplyr,小问题:我想根据id的分组填充id2的值 由此 > head(dta) id id2 1 B10388W4 0 2 B10388W4 B10388W 3 B10388W4 B10388W 简单地说 id id2 1 B10388W4 B10388W 2 B10388W4 B10388W 3 B10388W4 B10388W 基于组id填充值的整洁方式是什么 我想到了类似的事情 dta %>% group_by(id) %>%

小问题:我想根据
id
的分组填充
id2
的值

由此

> head(dta)
    id     id2
1 B10388W4       0
2 B10388W4 B10388W
3 B10388W4 B10388W
简单地说

    id     id2
1 B10388W4 B10388W
2 B10388W4 B10388W
3 B10388W4 B10388W
基于组
id
填充值的整洁方式是什么

我想到了类似的事情

dta %>% 
  group_by(id) %>% 
  mutate( id3 = ifelse(id2 == 0, lead(id2), id2) )
但它并不那么聪明,因为在其他地方可以找到一些0,它们具有相同的
id

欢迎任何意见

数据

dta = structure(list(id = c("B10388W4", "B10388W4", "B10388W4"), 
id2 = c("0", "B10388W", "B10388W")), row.names = c(NA, -3L), 
class = "data.frame", .Names = c("id", "id2"))
对于每个
id
(组),您可以使用唯一的
id2
值,该值不是
0
,并更新
id2
列。这假设对于每个唯一的
id
值,只有一个唯一的
id2
值,也可能有一个
0

# my example dataset
dt = data.frame(id = c("B10388W4","B10388W4","B10388W4","A10388W4","A10388W4","A10388W4"),
                id2 = c(0,"B10388W","B10388W","A10388W",0,0),
                stringsAsFactors = F)

dt

#         id     id2
# 1 B10388W4       0
# 2 B10388W4 B10388W
# 3 B10388W4 B10388W
# 4 A10388W4 A10388W
# 5 A10388W4       0
# 6 A10388W4       0


library(dplyr)

dt %>% 
group_by(id) %>%
mutate(id2_new = unique(id2[id2 != 0])) %>%
select(-id2) %>%
ungroup

#          id id2_new
#       (chr)   (chr)
# 1 A10388W4 A10388W
# 2 A10388W4 A10388W
# 3 A10388W4 A10388W
# 4 B10388W4 B10388W
# 5 B10388W4 B10388W
# 6 B10388W4 B10388W

您可以将零转换为
NA
s,然后使用
zoo::NA.locf
或者您可以使用
unique(id2[id2!=0])
来填充,而不是
lead(id2)
或类似的东西。您有什么理由更喜欢
do
而不是
mutate
?似乎
mutate(id2_new=unique(id2[id2!=0]))
会达到预期的效果。
do
会使事情变得过于复杂。我不知道为什么我没有在这里使用明显的
mutate
。将更新。感谢@aosmith的评论。
dta %>%
  filter(id2 != 0) %>%
  distinct %>%
  full_join(dta %>% select(id1) )