If row meets criteria, then TRUE else FALSE in R
我有如下嵌套数据:
1 2 3 4 5 6 7 8 9 10 | ID Date Behavior 1 1 FALSE 1 2 FALSE 1 3 TRUE 2 3 FALSE 2 5 FALSE 2 6 TRUE 2 7 FALSE 3 1 FALSE 3 2 TRUE |
我想创建一个名为
我期待这个结果:
1 2 3 4 5 6 7 8 9 10 | ID Date Behavior counter 1 1 FALSE 1 1 2 FALSE 2 1 3 TRUE 3 2 3 FALSE 1 2 5 FALSE 2 2 6 TRUE 3 2 7 FALSE 3 1 FALSE 1 3 2 TRUE 2 |
最后,我想提取每个唯一 ID 发生观察的最小值
非常感谢任何和所有的帮助!
I'd like to create a counter within each array of unique
ID s and from there, ultimately pull the row level info - the question is how long on average does it take to reach aTRUE
我感觉这里可能存在 XY 问题。您可以直接回答后一个问题,如下所示:
1 2 3 | > library(plyr) > mean(daply(d, .(ID), function(grp)min(which(grp$Behavior)))) [1] 2.666667 |
(其中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | do.call(rbind, by(df, list(df$ID), function(x) {n = nrow(x); data.frame(x, Counter = c(1:(m<-which(x$Behavior)), rep(NA, n-m)))})) ID Date Behavior Counter 1.1 1 1 FALSE 1 1.2 1 2 FALSE 2 1.3 1 3 TRUE 3 2.4 2 3 FALSE 1 2.5 2 5 FALSE 2 2.6 2 6 TRUE 3 2.7 2 7 FALSE NA 3.8 3 1 FALSE 1 3.9 3 2 TRUE 2 df = read.table(text ="ID Date Behavior 1 1 FALSE 1 2 FALSE 1 3 TRUE 2 3 FALSE 2 5 FALSE 2 6 TRUE 2 7 FALSE 3 1 FALSE 3 2 TRUE", header = T) |
这里是一个 dplyr 解决方案,它为每个 ID 中的每个 TRUE 找到行号:
1 2 3 4 5 | library(dplyr) newdf <- yourdataframe %>% group_by(ID) %>% summarise( ftrue = which(Behavior)) |