这是一个假设数据框:
a <- c(1:10)
b <- sample(seq(from = 0, to = 1, by =1), size = 10, replace = TRUE)
data <- data.frame(a,b)
输出看起来像这样:
a b
1 1 1
2 2 1
3 3 0
4 4 0
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 0
我想创建一个新列(c),计算b值在当前a值之前重复的次数:
a b c
1 1 1 0
2 2 1 1
3 3 0 0
4 4 0 1
5 5 1 0
6 6 1 1
7 7 1 2
8 8 1 3
9 9 1 4
10 10 0 0
我认为它可能需要if命令,例如:如果b == shift(b)而不是c = +1,否则:0,但我对r很新,所以我不太确定实施这样的程序。任何帮助将不胜感激。
编辑:努力寻求解决方案:
data <- data.table(data)
data[, c := b + shift(b)]
此代码将创建一个列(c),该列将使用当前值添加先前的值。
答案 0 :(得分:2)
如果您不关注使用data.table
,可以查看rle
。
set.seed(123)
a <- c(1:10)
b <- sample(seq(from = 0, to = 1, by =1), size = 10, replace = TRUE)
data <- data.frame(a,b)
len <- rle(data$b)$lengths
data$c <- unlist(sapply(len, function(x) seq.int(1,x)))-1
这给出了:
# > data
# a b c
# 1 1 0 0
# 2 2 1 0
# 3 3 0 0
# 4 4 1 0
# 5 5 1 1
# 6 6 0 0
# 7 7 1 0
# 8 8 1 1
# 9 9 1 2
# 10 10 0 0