R:如何将单个值传播到整个列?
考虑以下dfR:如何将单个值传播到整个列?,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
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