以R中的第一个实例为条件对数据进行子集

时间:2013-04-18 16:27:09

标签: r subset

数据:

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

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

3 个答案:

答案 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