计算由主题ID聚合的运行长度,条件是观察== 1

时间:2013-09-01 18:57:25

标签: r aggregate

我正在尝试使用R中的rle函数来计算下面示例中变量positive的运行长度,由变量id汇总。

这是一个玩具数据集(当然有一些怪癖):

test <- c('id', 'positive')
test$id <- rep(1:3, c(24, 24, 24))
set.seed(123456)          
test$positive <- round(runif(72, 0, 1))

test <- data.frame(test)
test <- subset(test, select = -X.id.)
test <- subset(test, select = -X.positive.)    

result <- aggregate(positive ~ id, data = test, FUN = rle)

当前设置的方式是读取变量positive的所有可能值(0和1)的运行长度。是否可以调整此函数,使其仅在positive == 1

时评估运行长度

在一天结束时,我最终想弄清楚如何计算每个主题两个或更多连续月份为正(positive == 1)的实例数。

更新:

我有一个名为event的变量,其值为0或1.对于根据以下建议中的代码开发的两个或多个正面事件的每个事件,是否可以对我们的结果进行分层如果event == 1在任何正面月份出现,那么它的分类将不同于所有月份event == 0的一系列正数?

玩具数据集如下所示:

set.seed(123456)
x <- c(1, 2, 1)
test <- data.frame(id = rep(1:3, each = 24), positive = round(runif(72, 0, 1)), event = round(runif(72, 0, 1)))

results <- aggregate(positive ~ id + event, data = test, FUN=function(x) with(rle(x),   sum(lengths > 1 & values == 1)))
aggregate(positive ~ event, data = result, FUN=sum)

然而,这段代码给出了事件和积极的所有可能的排列,而我想将结果分界为仅计算任何event == 1的两个或更多个连续正月的出现次数。或者,如果更容易仅评估所有event == 0也是一个很好的解决方案的连续正月数。

3 个答案:

答案 0 :(得分:3)

要计算两个或更多连续阳性的出现次数,请使用:

aggregate(positive ~ id, data=test, FUN=function(x) with(rle(x), sum(lengths>=2 & values==1)))

(灵感来自@ sgibb的答案。)

编辑:计算2个或更多连续正数的数量,使得其中任何一个具有事件== 1,由id分隔:

计算每条记录所属的运行:

tmp <- within(test, run <- ave(positive, by=id, FUN=function(x)cumsum(c(1,diff(x)!=0))))

# id positive event run
#  1        1     1   1
#  1        1     0   1
#  1        0     1   2
#  1        0     0   2
#  1        0     1   2
#  1        0     0   2

对于每个ID和每个运行标记,如果至少有一条记录event==1 且运行长度&gt; = 2

tmp2 <- aggregate(event~id+positive+run, data=tmp, function(x)any(x>0) && length(x)>=2)

# id positive run event
#  2        0   1 FALSE
#  1        1   1  TRUE
#  3        1   1 FALSE
#  1        0   2  TRUE
#  3        0   2  TRUE
#  2        1   2  TRUE

现在只需计算每个ID和每种运行(positive==1positive==0)中标记的运行次数:

aggregate(event~positive+id, tmp2, sum)

# positive id event
#        0  1     1
#        1  1     2
#        0  2     1
#        1  2     3
#        0  3     3
#        1  3     1

答案 1 :(得分:1)

你的意思是这样的吗?:

aggregate(positive ~ id, data=test, FUN=function(x) { 
  r <- rle(x); 
  return(r$length[r$value == 1])
})
#   id            positive
# 1  1       2, 1, 1, 7, 1
# 2  2 4, 2, 1, 4, 2, 1, 2
# 3  3       1, 7, 1, 1, 1

答案 2 :(得分:1)

“当天结束时”部分的ddply版本:

library(plyr)
set.seed(123456)
test <- data.frame(id = rep(1:3, each = 24), positive = round(runif(72, 0, 1))) 

ddply(.data = test, .variables = .(id), function(x){
      rl <- rle(x$positive)
      sum(rl$length[rl$value == 1] > 1)
      }
)

#      id V1
#    1  1  2
#    2  2  5
#    3  3  1