【问题标题】:Calculate run length aggregated by subject ID conditional on observation == 1根据观察 == 1 计算由主题 ID 聚合的运行长度
【发布时间】:2013-09-01 18:57:25
【问题描述】:

我正在尝试使用 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) 的实例数。 p>

更新:

我有一个名为 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 的连续积极月份的数量更容易,那也是一个很好的解决方案。

【问题讨论】:

  • 我已经相应地编辑了我的答案。请检查它是否有帮助。

标签: r aggregate


【解决方案1】:

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

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

【讨论】:

  • 非常接近——谢谢。是否可以将run 变量限制为仅标记两个或多个连续阳性而不包括那些运行为 0 的那些?
  • @Entropy,只需从 tmp2 中删除这些行,如下所示:tmp3 &lt;- tmp2[tmp2[,"positive"]==1,],然后使用 aggregate(event~id, tmp3, sum)。输出必须与上面的结果匹配,不包括 positive==0. 的行
  • 这会计算长度为 1 的 positive==1 的运行(一次观察或一个月)。是否可以将最终聚合命令限制为仅将具有 两个或更多连续正数的命令相加?例如,使用当前的aggregate(event~id, tmp3, sum) 代码 ID#2 Run#6 仅包含 1 个观察值,并且当前正在计算中。是否有可能避免计数仅出现 1 个孤立阳性的此类事件?
  • @Entropy 已修复。在tmp2 中包含条件length(x)&gt;=2。感谢您发现这一点。检查 ID#2 Run#6 和其他。
【解决方案2】:

你的意思是这样的吗?:

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

【讨论】:

    【解决方案3】:

    “一天结束时”部分的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-11
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多