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

R:如何将单个值传播到整个列?,r,dplyr,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

考虑以下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
如何使用
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
我们使用

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
df%>%groupby(group)%>%
变异(输出=ifelse(长度(值[time==0][1])>0,值[time==0][1],NA))
组时间值输出
1A-11023
2 A 0 23 23
3 A 2 5 23
4 B 0 22
5 B 4 11 22
6C110NA
编辑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
组时间值输出
1A-112
2 A 0 2 2
3 A 2 3 2
4B044
5 B 4 5 4
6B064
7c37na
8C58NA

您可以在base R中执行此操作:

df$output <- df[df$time==0,]$value[as.numeric(df$group)]

#  group time value output
#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

df$output这里有一个使用
data.table的选项

library(data.table)
setDT(df)[, output := value[time==0][1L], by = group]
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

在没有时间的情况下编辑==0.nice,而且要挑剔,如果有重复的怎么办?;-)这就是为什么我认为联合会有所帮助。基本上,我们只需要播放第一场没有错过的比赛。你认为呢?如果时间==0不止一次,它会给你第一个值。据我所知,它的基本R是
df$value[df$time==0]
会起作用
Dplyr
允许我们使用(df,value[time==0])跳过
df$
之类的
does.akrun保存一天。现在有道理了。谢谢大家,让我修改一下这个例子来合并that@m0h3n在BaseR中有一个解决方案也很好。你能解释一下
]
]$value[as.numeric(df$group)
中做了什么吗?我不明白。好的,谢谢你这么做
]$value[as.numeric(df$group)
是在第一个逗号之后写
df$value[as.numeric(df$group)
的快捷方式吗?@Noobie不。如果我们这样做
vec实际上,我认为这里的语法是
[time==0][1L]
很有意义,因为你正在进行第一次观察,
time==0
。我仍然不明白为什么在接受的答案
value[time==0]
还返回时间=0的第一个观察值,而不是时间=0的所有观察值。有什么想法吗?@Noobie我想应该会有一条警告消息。编辑该答案后,您的解决方案中缺少了类似的
[1]
。现在一切都有意义了。
df$output <- df[df$time==0,]$value[as.numeric(df$group)]

#  group time value output
#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
library(data.table)
setDT(df)[, output := value[time==0][1L], by = group]
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