R: Cree la función Aplicar para encontrar el mínimo de columnas en función de las condiciones en otras columnas (relacionadas)

Con datos como los siguientes, estoy tratando de reasignar cualquiera de las columnas de prueba (prueba_A, etc.) a sus columnas de tiempo correspondientes (tiempo_A, etc.) si la prueba es verdadera, y luego encontrar el mínimo de todos los tiempos de prueba verdaderos .

     [ID] [time_A] [time_B] [time_C] [test_A] [test_B] [test_C] [min_true_time]
[1,]    1        2        3        4    FALSE     TRUE     FALSE          ?
[2,]    2       -4        5        6     TRUE     TRUE     FALSE          ?
[3,]    3        6        1       -2     TRUE     TRUE      TRUE          ?
[4,]    4       -2        3        4     TRUE    FALSE     FALSE          ?

Mi conjunto de datos real es bastante grande, por lo que mis intentos de bucles if y for han fallado miserablemente. Pero no puedo hacer ningún progreso en una función de aplicación.

Y más tiempo negativo, digamos -2 se consideraría el mínimo para la fila 3.

Cualquier sugerencia es bienvenida con mucho gusto

preguntado el 09 de marzo de 13 a las 14:03

Debe proporcionar algunas ideas sobre cómo se ve su prueba, no puede distinguirla de la muestra. Pero lo más probable es que ifelse() es lo que buscas. -

Tus datos se ven raros. Parece una matriz, pero una matriz solo puede contener un tipo de datos. ¿Tienes una matriz de texto? -

Lo siento por la falta de detalles. Pero mis datos reales son un marco de datos con 400000 observaciones. Creé las variables de prueba en función de si otra columna (que describe la categoría time_A) contenía algún carácter de una lista de palabras clave. Solo necesito los tiempos mínimos de esas pruebas que dieron como resultado VERDADERO. -

1 Respuestas

No das mucha información, pero creo que esto hace lo que necesitas. No tengo idea si es lo suficientemente eficiente, ya que no dice qué tan grande es realmente su conjunto de datos.

#I assume your data is in a data.frame:
df <- read.table(text="ID time_A time_B time_C test_A test_B test_C 
1    1        2        3        4    FALSE     TRUE     FALSE
2    2       -4        5        6     TRUE     TRUE     FALSE
3    3        6        1       -2     TRUE     TRUE      TRUE
4    4       -2        3        4     TRUE    FALSE     FALSE")


#loop over all rows and subset column 2:4 with column 5:7, then take the mins
df$min_true_time <- sapply(1:nrow(df), function(i) min(df[i,2:4][unlist(df[i,5:7])]))
df
#  ID time_A time_B time_C test_A test_B test_C min_true_time
#1  1      2      3      4  FALSE   TRUE  FALSE             3
#2  2     -4      5      6   TRUE   TRUE  FALSE            -4
#3  3      6      1     -2   TRUE   TRUE   TRUE            -2
#4  4     -2      3      4   TRUE  FALSE  FALSE            -2

Otra forma, que podría ser más rápida (no estoy de humor para la evaluación comparativa):

m <- as.matrix(df[,2:4])
m[!df[,5:7]] <- NA
df$min_true_time <- apply(m,1,min,na.rm=TRUE)

respondido 09 mar '13, 15:03

Esto es genial. ¡Muy apreciado! - km5041

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.