我正在尝试使用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
也是一个很好的解决方案的连续正月数。
答案 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==1
或positive==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