2

我正在尝试使用rleR 中的函数来计算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)

当前设置的方式是读取变量的所有可能值(0 和 1)的运行长度positive。是否可以调整此函数,使其仅在 时评估运行长度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 和 positive 的所有可能排列,而我想将结果限定为仅计算两个或多个连续正月的出现次数,其中任何event == 1. 或者,如果只评估连续积极月份的数量更容易,那么这也是event == 0一个很好的解决方案。

4

3 回答 3

3

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

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

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

编辑:计算 2 个或更多连续阳性的数量,使它们中的任何一个具有 event==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 且运行长度 >= 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
于 2013-09-01T20:40:09.080 回答
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
于 2013-09-01T19:17:42.057 回答
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
于 2013-09-01T20:23:43.557 回答