Tengo un marco de datos que se ve así:

typ1  typ2  typ3
   T     T     F
   F     F     F
   T     F     F

Y quiero mutar una cuarta columna lógica que determine si alguno de los otros tres es VERDADERO, entonces {T, F, T}.

mutate(isAnyType = any(typ1, typ2, typ3)) parece estar usando las columnas completas, cuando me gustaría usar la información por fila. Cualquier idea es apreciada.

1
larsonsm 27 abr. 2020 a las 20:30

3 respuestas

La mejor respuesta

Podemos usar reduce con | para verificar si hay elementos VERDADEROS en cada fila

library(dplyr)
library(purrr)
df1 %>%
   mutate(isAnyType = reduce(., `|`))

O usando rowSums en base R

df1$isAnyType <- rowSums(df1) > 0

O otra opción es pmap

df1 %>%
   mutate(isAnyType = pmap_lgl(., ~ any(c(...)))

Datos

df1 <- structure(list(typ1 = c(TRUE, FALSE, TRUE), typ2 = c(TRUE, FALSE, 
FALSE), typ3 = c(FALSE, FALSE, FALSE)), class = "data.frame", 
row.names = c(NA, 
-3L))
2
akrun 27 abr. 2020 a las 17:38

Parece que la respuesta se puede encontrar aquí: Uso de any () vs | en dplyr :: mutate

En lugar de cualquier (), que utiliza el marco de datos completo, puedo usar el operador OR, para que mutate(isAnyType = typ1 |typ2 |typ3)) funcione

0
larsonsm 27 abr. 2020 a las 17:40

Si aprovecha los valores booleanos que se almacenan como T = 1, F = 0, creo que podría usar la función rowSums () para evaluar las instancias de T / F en fila. ¿Es esto lo que estás buscando?

Entrada:

df <- data.frame(typ1 = c(T, F, T),
                 typ2 = c(T,F, F),
                 typ3 = c(F, F, F))
library(dplyr)
df %>% 
  mutate(typ4 = ifelse(rowSums(df) ==0, F, T))

Salida:

   typ1  typ2  typ3  typ4
1  TRUE  TRUE FALSE  TRUE
2 FALSE FALSE FALSE FALSE
3  TRUE FALSE FALSE  TRUE
0
Conner Sexton 27 abr. 2020 a las 17:44