R 当第一个和最后一个观察值等于某个值时,求和之间的某些值
我有点像:R 当第一个和最后一个观察值等于某个值时,求和之间的某些值,r,R,我有点像: df<-data.frame(group=c(1, 1, 1, 1,1, 2, 2, 2, 2, 2, 3, 3, 3), have=c(1, 0, 1, 0, 1, 1, 0,0,0,1, 1,0,0), wantsum=c(2,2,2,2,2,3,3,3,3,3,0,0,0)) # group have wantsum #1 1 1 2 #2 1
df<-data.frame(group=c(1, 1, 1, 1,1, 2, 2, 2, 2, 2, 3, 3, 3),
have=c(1, 0, 1, 0, 1, 1, 0,0,0,1, 1,0,0),
wantsum=c(2,2,2,2,2,3,3,3,3,3,0,0,0))
# group have wantsum
#1 1 1 2
#2 1 0 2
#3 1 1 2
#4 1 0 2
#5 1 1 2
#6 2 1 3
#7 2 0 3
#8 2 0 3
#9 2 0 3
#10 2 1 3
#11 3 1 0
#12 3 0 0
#13 3 0 0
谢谢我们可以在按“组”分组后创建一个条件,方法是检查
如果所有
则“have”中的第一个和最后一个观察值为1,然后获取“0”值的和,否则返回0
library(dplyr)
df %>%
group_by(group) %>%
mutate(wantsum2 = if(all(c(first(have), last(have)) == 1)) sum(have == 0) else 0)
# A tibble: 13 x 4
# Groups: group [3]
# group have wantsum wantsum2
# <dbl> <dbl> <dbl> <dbl>
# 1 1 1 2 2
# 2 1 0 2 2
# 3 1 1 2 2
# 4 1 0 2 2
# 5 1 1 2 2
# 6 2 1 3 3
# 7 2 0 3 3
# 8 2 0 3 3
# 9 2 0 3 3
#10 2 1 3 3
#11 3 1 0 0
#12 3 0 0 0
#13 3 0 0 0
df %>%
group_by(group) %>%
mutate(wantsum2 = sum(have == 0) * all(c(first(have), last(have)) == 1) )