4

数据:

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 行),我对此不感兴趣!

我非常感谢您在这个(我怀疑很简单)问题上的帮助!

4

3 回答 3

1

这是一种相当复杂的方法:

data$counter = cumsum(data$B == 1)
sum(data$A[(data$counter >= 1:nrow(data) - sum(data$counter == 0)) &
           (data$counter != 0)])
于 2013-04-18T16:45:45.337 回答
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). 从 start index = "2" 开始,您想获取所有连续(或连续,即c(2,3,4,5...))的索引。因此,从2取那么多连续数字并将它们等同起来。当它们不连续时,它们将不相等。也就是说,一旦出现不匹配,后面的所有其他数字也会出现不匹配。因此,匹配相等的前几个数字只会是“连续”的数字(这是您想要的)。

于 2013-04-18T17:00:50.830 回答
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
于 2013-04-18T23:53:43.687 回答