Aquí está mi marco de datos de mediciones repetidas

subject  StartTime_month  StopTime_month  ...

1          0.0            0.5
1          0.5            1.0  
1          1.0            3.0
1          3.0            6.0
1          6.0            9.6
1          9.6            12.1
2          0.0            0.5
2          0.5            1.0 
2          1.0            1.9
2          1.9            3.2
2          3.2            6.2
2          6.2            8.2

Me gustaría seleccionar las filas que tienen el primer StopTime_month> 6.0 para cada tema

1
juanli 29 dic. 2016 a las 12:50

3 respuestas

La mejor respuesta

Podemos probar con data.table. Convierta el 'data.frame' a 'data.table' (setDT(df1)), agrupado por 'subject', obtenga el índice de fila de la primera instancia donde 'StopTime_month' es mayor que 6, y úselo para subconjunto filas

library(data.table)
setDT(df1)[df1[,  .I[which(StopTime_month > 6)[1]], by = subject]$V1]
#   subject StartTime_month StopTime_month
#1:       1             6.0            9.6
#2:       2             3.2            6.2

Supongamos que si necesitamos todas las filas hasta la primera instancia de 'StopTime_month' mayor que 6,

setDT(df1)[, .SD[cumsum(StopTime_month > 6)<2], by = subject]
#     subject StartTime_month StopTime_month
# 1:       1             0.0            0.5
# 2:       1             0.5            1.0
# 3:       1             1.0            3.0
# 4:       1             3.0            6.0
# 5:       1             6.0            9.6
# 6:       2             0.0            0.5
# 7:       2             0.5            1.0
# 8:       2             1.0            1.9
# 9:       2             1.9            3.2
#10:       2             3.2            6.2

O usando dplyr

library(dplyr)
df1 %>% 
   filter(StopTime_month > 6) %>%
   group_by(subject) %>% 
   slice(1L)
#   subject StartTime_month StopTime_month
#     <int>           <dbl>          <dbl>
#1       1             6.0            9.6
#2       2             3.2            6.2
3
akrun 29 dic. 2016 a las 10:01

Una solución base R:

Para el tema 1:

df[df$subject==1 & df$StopTime_month > 6,][1,]

Para el tema 2:

df[df$subject==2 & df$StopTime_month > 6,][1,]

(donde df es su marco de datos)

0
maRtin 29 dic. 2016 a las 10:04

Con base R aggregate

aggregate(.~subject, df[df$StopTime_month > 6, ], function(x) x[1])

#  subject StartTime_month StopTime_month
#1       1             6.0            9.6
#2       2             3.2            6.2
1
Ronak Shah 3 ene. 2017 a las 06:51