根据条件在R中从先前值增加

时间:2018-07-01 08:31:55

标签: r dataframe

我正在寻找针对自己特定问题的答案,但未找到结论。

我有一个带有数据的数据框

ID  a
1   0
2   0
3   1
4   1
5   1
6   1
7   0
8   1
9   1
10  0
11  1
12  0
13  0

现在,如果a == 1,我想添加与前一个b相比数字增加的“ b”列

这样的结果

ID  a   b
1   0   0
2   0   0
3   1   1
4   1   2
5   1   3
6   1   4
7   0   0
8   1   1
9   1   2
10  0   0
11  1   1
12  0   0
13  0   0
14  1   1
15  1   2
16  1   3
17  1   4

谢谢!

3 个答案:

答案 0 :(得分:1)

这是一种使用rleid()中的data.table来创建我们在ave()内部使用的分组变量的方法。然后,我们计算每组cumsum的{​​{1}},无论何时0

a == 0

一旦加载library(data.table) df$new_b <- with(df, ave(a, rleid(a), FUN = cumsum)) df # ID a b new_b #1 1 0 0 0 #2 2 0 0 0 #3 3 1 1 1 #4 4 1 2 2 #5 5 1 3 3 #6 6 1 4 4 #7 7 0 0 0 #8 8 1 1 1 #9 9 1 2 2 #10 10 0 0 0 #11 11 1 1 1 #12 12 0 0 0 #13 13 0 0 0 #14 14 1 1 1 #15 15 1 2 2 #16 16 1 3 3 #17 17 1 4 4 ,您也可以这样做

data.table

数据

setDT(df)[, new_b := cumsum(a), rleid(a)][]

答案 1 :(得分:1)

接下来如何使用基数R的test: any; subjects: Array<any>; compareObjects(o1: any, o2: any): boolean { return o1.name === o2.name && o1._id === o2._id; }

rle

样本数据

df$b <- unlist(mapply(
    function(len, val) if (val == 0) rep(0, len) else 1:len,
    rle(df$a)$lengths, rle(df$a)$values));
df;
#   ID a b
#1   1 0 0
#2   2 0 0
#3   3 1 1
#4   4 1 2
#5   5 1 3
#6   6 1 4
#7   7 0 0
#8   8 1 1
#9   9 1 2
#10 10 0 0
#11 11 1 1
#12 12 0 0
#13 13 0 0

答案 2 :(得分:0)

使用dplyr可以对cumsum(a==0)进行分组。这将创建一个具有上一行的组(如果a=0的所有行都可以使用a=1。现在,lag(cumsum(a==1))将提供预期的计数。

library(dplyr)

df %>% group_by(grp = cumsum(a==0)) %>%
  mutate(b = ifelse(a==1, lag(cumsum(a==1))+1,0)) %>% 
  ungroup() %>% 
  select(-grp) %>%
  as.data.frame()

#    ID a b
# 1   1 0 0
# 2   2 0 0
# 3   3 1 1
# 4   4 1 2
# 5   5 1 3
# 6   6 1 4
# 7   7 0 0
# 8   8 1 1
# 9   9 1 2
# 10 10 0 0
# 11 11 1 1
# 12 12 0 0
# 13 13 0 0

数据:

df <- read.table(text="
ID  a
1   0
2   0
3   1
4   1
5   1
6   1
7   0
8   1
9   1
10  0
11  1
12  0
13  0",
header = TRUE, stringsAsFactors = FALSE)