我尝试使用R来查找在300,000多行的数据帧中成功之前的平均尝试次数。数据结构如下。
EventID SubjectID ActionID Success DateUpdated
a b c TRUE 2014-06-21 20:20:08.575032+00
b a c FALSE 2014-06-20 02:58:40.70699+00
我仍在通过R学习。看起来我可以使用ddply根据主题和动作将框架分开(我想看看给定主题在成功之前尝试动作的次数),但我无法弄清楚如何编写我需要应用的公式。
答案 0 :(得分:2)
library(data.table)
# example data
dt = data.table(group = c(1,1,1,1,1,2,2), success = c(F,F,T,F,T,F,T))
# group success
#1: 1 FALSE
#2: 1 FALSE
#3: 1 TRUE
#4: 1 FALSE
#5: 1 TRUE
#6: 2 FALSE
#7: 2 TRUE
dt[, which(success)[1] - 1, by = group]
# group V1
#1: 1 2
#2: 2 1
将group
替换为list(subject, action)
或适合您的数据的任何内容(将其从data.table
转换为data.frame
后)。
答案 1 :(得分:2)
跟进Tarehman的建议,因为我喜欢rle
,
foo <- rle(data$Success)
mean(foo$lengths[foo$values==FALSE])
答案 2 :(得分:1)
这可能是一个完全不同的问题的答案,但这是否接近你想要的?
tfs <- sample(c(FALSE,TRUE),size = 50, replace = TRUE, prob = c(0.8,0.2))
tfs_sums <- cumsum(!tfs)
repsums <- tfs_sums[duplicated(tfs_sums)]
mean(repsums - c(0,repsums[-length(repsums)]))
tfs
[1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[20] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE
[39] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
repsums
1 6 8 9 20 20 20 20 24 26 31 36
repsums - c(0,repsums[-length(repsums)])
1 5 2 1 11 0 0 0 4 2 5 5
显示的最后一个向量是每个连续&#34;运行的长度&#34;向量tfs
答案 3 :(得分:1)
你可以使用data.table解决所需问题,如下所示:
library (data.table)
df=data.frame(EventID=c("a","b","c","d"),SubjectID=c("b","a","a","a"),ActionID=c("c","c","c","c"),Success=c(TRUE,FALSE,FALSE,TRUE))
dt=data.table(df)
dt[ , Index := 1:.N , by = c("SubjectID" , "ActionID","Success") ]
现在,此索引列将保留每个主题/操作连续实验所需的数字。您需要聚合才能获得该数字(最大数量)
result=stats:::aggregate.formula(Index~(SubjectID+ActionID),data=dt,FUN= function(x) max(x))
所以这会给你最大的索引,它是你达到真实之前的谬误数。请注意,您可能需要进行进一步处理以过滤掉从未有过真正
的主题