实际上,我有一个具有2个值的数据框:
v1<- c(1,1,1,0,0,1,1,2,2,2,0,0,0,2,1,1,0,1,0,2)
v2<- c(5,5,10,-1,-5,9,7,6,1,5,3,-4,7,-6,-3,-1,7,1,5,3)
df<- data.frame(v1=v1, v2=v2)
> df
v1 v2
1 1 5
2 1 5
3 1 10
4 0 -1
5 0 -5
6 1 9
7 1 7
8 2 6
9 2 1
10 2 5
11 0 3
12 0 -4
13 0 7
14 2 -6
15 1 -3
16 1 -1
17 0 7
18 1 1
19 0 5
20 2 3
我要执行的操作是基于以下事实替换值V2上的值:如果V1上存在连续0(仅连续0,所以1,0,1不会计数,而1,0,0,1会计数并等等),所有V2将等于第一个V2值(其中V1中出现0)。
例如:
> df[3:6,]
v1 v2
3 1 10
4 0 -1
5 0 -5
6 1 9
#Must become
> df[3:6,]
v1 v2
3 1 10
4 0 -1
5 0 -1
6 1 9
或者:
> df[10:14,]
v1 v2
10 2 5
11 0 3
12 0 -4
13 0 7
14 2 -6
#Must become
> df[10:14,]
v1 v2
10 2 5
11 0 3
12 0 3
13 0 3
14 2 -6
仅当'v1'中的值为0时,我们才能使用rleid
(from data.table
)和replace
'v2'first
为'v2'的值创建组all
library(dplyr)
library(data.table)
df %>%
group_by(grp = rleid(v1)) %>%
mutate(v2 = if(all(v1 == 0)) first(v2) else v2) %>%
ungroup %>%
select(-grp)
# A tibble: 20 x 2
# v1 v2
# <dbl> <dbl>
# 1 1 5
# 2 1 5
# 3 1 10
# 4 0 -1
# 5 0 -1
# 6 1 9
# 7 1 7
# 8 2 6
# 9 2 1
#10 2 5
#11 0 3
#12 0 3
#13 0 3
#14 2 -6
#15 1 -3
#16 1 -1
#17 0 7
#18 1 1
#19 0 5
#20 2 3
或使用data.table
(来自@IceCreamToucan的评论)
library(data.table)
setDT(df)[, v2 := if(first(v1) == 0) first(v2) else v2, rleid(v1)]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句