我有类似的东西:
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))
我想将每个组的0总数相加,但是仅当第一个和最后一个观察值等于1时。
# 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
谢谢
答案 0 :(得分:1)
我们可以按'group'分组后创建条件,方法是检查{have'中的if
和all
观察值first
last
,然后得到sum
个“ 0”值或else
返回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
有多种方法可以实现此目的,因此可以通过将if/else
生成的逻辑矢量乘以all
-> TRUE/FALSE
来修改1/0
条件,任何数字乘以0-> 0再乘以1->数字
df %>%
group_by(group) %>%
mutate(wantsum2 = sum(have == 0) * all(c(first(have), last(have)) == 1) )