我正在寻找针对自己特定问题的答案,但未找到结论。
我有一个带有数据的数据框
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
谢谢!
答案 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)