如果行符合条件,则为TR,否则为R,否则为FALSE

时间:2014-12-17 19:29:29

标签: r

我有嵌套的数据,如下所示:

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

我想创建一个名为counter的列,其中对于每个唯一ID,计数器会将一个添加到下一行,直到Behavior = TRUE

我期待这个结果:

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发生观察的最小counter。但是,我无法为当前counter问题开发解决方案。

非常感谢任何和所有帮助!

3 个答案:

答案 0 :(得分:1)

  

我想在每个唯一ID数组中创建一个计数器,并从那里最终得出行级别信息 - 问题是到达{{1}平均需要多长时间}

我觉得这里可能会有XY problem。你可以直接回答你的后一个问题,如下:

TRUE

(其中> library(plyr) > mean(daply(d, .(ID), function(grp)min(which(grp$Behavior)))) [1] 2.666667 是您的数据框。)

答案 1 :(得分:0)

这是一个dplyr解决方案,可以在每个ID中找到每个TRUE的行号:

library(dplyr)
newdf <- yourdataframe %>%
           group_by(ID) %>%
           summarise(
             ftrue = which(Behavior)) 

答案 2 :(得分:0)

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)