数据:
row A B
1 1 1
2 1 1
3 1 2
4 1 3
5 1 1
6 1 2
7 1 3
大家好!我正在尝试做的事情(上面的例子)是在A列中对这些值求和,但仅当列B = 1时(所以从一个简单的子集行开始 - 下面)。
sum(data$A[data$B==1])
但是,我只想在第一次时间内执行此操作,直到值切换为止。如果该条件稍后在列中重新出现(示例中的第5行),我对它不感兴趣!
我真的很感谢你在这个问题上的帮助(我怀疑这很简单)!
答案 0 :(得分:1)
这是一个相当精细的方法:
data$counter = cumsum(data$B == 1)
sum(data$A[(data$counter >= 1:nrow(data) - sum(data$counter == 0)) &
(data$counter != 0)])
答案 1 :(得分:1)
另一种方式:
idx <- which(data$B == 1)
sum(data$A[idx[idx == (seq_along(idx) + idx[1] - 1)]])
# [1] 2
# or alternatively
sum(data$A[idx[idx == seq(idx[1], length.out = length(idx))]])
# [1] 2
这个想法:首先得到所有指数1.这里是c(2,3,5)
。从起始索引=“2”开始,您希望获得连续(或连续,即c(2,3,4,5...)
)的所有索引。所以,从2
取出许多连续的数字并将它们等同起来。一旦他们不连续,他们就不会平等。也就是说,一旦出现不匹配,所有其他后续数字也会出现不匹配。所以,匹配相等的前几个数字只是“连续”的数字(这是你想要的)。
答案 2 :(得分:1)
使用data.table
进行语法优雅,您可以使用rle
来完成此操作
library(data.table)
DT <- data.table(data)
DT[ ,B1 := {
bb <- rle(B==1)
r <- bb$values
r[r] <- seq_len(sum(r))
bb$values <- r
inverse.rle(bb)
} ]
DT[B1 == 1, sum(a)]
# [1] 2