R:如何将单个值传播到整个列?

标签 r dplyr

考虑以下 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 == 0value 的第一个非缺失值的列。当然,每个组中的每一行都会重复该值。换句话说,预期输出是

> 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/

相关文章:

r - 将两个 GRanges 对象相减

r - 如何通过 R 中每行中的可用数据组合进行标记

r - 对于 mutate() 中已弃用的 .data[[ ]],推荐的替代方案是什么?

r - 使用 dplyr mutate 自动生成新的变量名

r - 在 dplyr 中将 starts_with 与 group_by 结合使用

r - 仅通过 2 列键的第 2 列对 data.table 进行子集,使用二进制搜索而不是矢量扫描

r - 将数据框中的重复向量分配给 R 中的条件变量

r - 是否可以让函数识别其上方范围内的变量?

r - 如何设置 Rcpp::List 元素的类属性?

r - dplyr 仅返回分组和计算列