考虑以下 df,
group = c('A','A','A','B','B','B','C','C')
time = c(-1,0,2,0,4,0,3,5)
value = seq(1:8)
df <- data.frame(group,time,value)
> df
group time value
1 A -1 1
2 A 0 2
3 A 2 3
4 B 0 4
5 B 4 5
6 B 0 6
7 C 3 7
8 C 5 8
我想为每个 group
创建一个包含 time == 0
时 value
的第一个非缺失值的列。当然,每个组中的每一行都会重复该值。换句话说,预期输出是
> df
group time value output
1 A -1 1 2
2 A 0 2 2
3 A 2 3 2
4 B 0 4 4
5 B 4 5 4
6 B 0 6 4
7 C 3 7 NA
8 C 5 8 NA
我如何使用 dplyr
做到这一点?像这样的东西:
df %>%
mutate(output = coalesce(ifelse(time== 0, value, NA)) )
不成功。
非常感谢!
最佳答案
df%>%
group_by(group)%>%
mutate(output=value[time==0][1])
#we take the first non missing match
group time value output
<fctr> <dbl> <dbl> <dbl>
1 A -1 10 23
2 A 0 23 23
3 A 2 5 23
4 B 0 22 22
5 B 4 11 22
编辑:
如果没有time==0
group time value
1 A -1 10
2 A 0 23
3 A 2 5
4 B 0 22
5 B 4 11
6 C 1 10
我们使用
df%>%group_by(group)%>%
mutate(output=ifelse(length(value[time==0][1])>0,value[time==0][1],NA))
group time value output
<fctr> <dbl> <dbl> <dbl>
1 A -1 10 23
2 A 0 23 23
3 A 2 5 23
4 B 0 22 22
5 B 4 11 22
6 C 1 10 NA
编辑 2:同一组的多个 0
group time value output
<fctr> <dbl> <int> <int>
1 A -1 1 2
2 A 0 2 2
3 A 2 3 2
4 B 0 4 4
5 B 4 5 4
6 B 0 6 4
7 C 3 7 NA
8 C 5 8 NA
关于R:如何将单个值传播到整个列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40108886/