2012-10-04 43 views
25

Intenté hacer esta búsqueda simple pero no encontré nada en el símbolo de porcentaje (%) en R. ¿Qué significa %in% en el siguiente código?¿Qué significan los operadores% op% en R? Por ejemplo, "% en%"

time(x) %in% time(y) 

x y y son matrices.

¿Cómo busco ayuda en %in% y funciones similares que siguen el patrón %stuff%, ya que no puedo encontrar el archivo de ayuda?

preguntas relacionadas:
What does eg %+% do? in R
The R %*% operator
What does %*% mean in R
https://stackoverflow.com/questions/23091654/what-does-it-mean-when-something-is-between-two-percent-signs-in-r
What does %||% do in R?
What does %>% mean in R

+1

Véase también http://stackoverflow.com/questions/1328903/what-does- eg-do-in-r?rq = 1 –

Respuesta

19

cotizaciones poner alrededor de él para encontrar la página de ayuda. Cualquiera de estos trabajos

> help("%in%") 
> ?"%in%" 

Una vez en la página de ayuda, verá que

'% en%' se define actualmente como

' "% en%" < - partido de la función (x, mesa) (x, mesa, NOMATCH = 0)> 0'


Desde time es un genérico, no sé qué devuelve time(X2) sin saber qué es X2. Pero, %in% le dice qué elementos del lado izquierdo también están en el lado derecho.

> c(1:5) %in% c(3:8) 
[1] FALSE FALSE TRUE TRUE TRUE 

Véase también, intersect

> intersect(c(1:5), c(3:8)) 
[1] 3 4 5 
+0

Entonces, ¿qué (tiempo (X2)% en% tiempo (Y)) devuelve básicamente la fecha más grande entre X2 e Y? Gracias a ambos por las respuestas –

+1

No. ver '?"% en% "' ;-) – GSee

2

%in% es un operador que se utiliza para encontrar y subconjunto múltiples ocurrencias del mismo nombre o valor en un marco de matriz o de datos.

Por ejemplo 1: creación de subconjuntos con el mismo nombre

set.seed(133) 
x <- runif(5) 
names(x) <- letters[1:5] 
x[c("a", "d")] 
# a   d 
# 0.5360112 0.4231022 

Ahora cambia el nombre de "d" a "a"

names(x)[4] <- "a" 

Si intenta extraer los nombres similares y su valores utilizando el subíndice anterior, no funcionará. Observe el resultado, no tiene los elementos de [1] y [4].

x[c("a", "a")] 

#  a   a 
# 0.5360112 0.5360112 

Por lo tanto, puede extraer los dos "a" s desde una posición diferente en una variable mediante el uso de %in% operador binario.

names(x) %in% "a" 
# [1] TRUE FALSE FALSE TRUE FALSE 

#assign it to a variable called "vec" 
vec <- names(x) %in% "a" 

#extract the values of two "a"s 
x[vec] 
#   a   a 
# 0.5360112 0.4231022 

Ejemplo 2: Subconfiguración múltiples valores de una columna Consulte this site para un ejemplo

18

más general, %foo% es la sintaxis para un operador binario. Los operadores binarios en R son en realidad funciones simplemente disfrazadas, y toman dos argumentos (el anterior y el posterior al operador se convierten en los primeros dos argumentos de la función).

Por ejemplo:

> `%in%`(1:5,4:6) 
[1] FALSE FALSE FALSE TRUE TRUE 

Mientras %in% se define en la base de R, también puede definir su propia función binaria:

`%hi%` <- function(x,y) cat(x,y,"\n") 
> "oh" %hi% "my" 
oh my 
+0

otro operador binario definido por el usuario es% *% que hace una verdadera multiplicación de matrices, mientras que el operador * solo hace cálculos vectorizados de datos. – Sathish

+1

@Sathish Notado, aunque llamaría% *%,% en%, etc. operadores "no definidos por el usuario" o "incorporados". –

+0

Esta franqueza de esta respuesta fue sorprendentemente útil, a pesar de comprender las respuestas mejor calificadas – Coruscate5

37

no pensé respuestas sathish de GSEE o del fueron lo suficientemente porque "%" tiene significado por sí mismo y no solo en el contexto del operador %in%. Es el mecanismo para definir nuevos operadores de infijo por parte de los usuarios. Es un problema mucho más general que las virtudes del operador de infijo %in% o su antecesor de prefijo más general match. Podría ser tan simple como hacer una (s) um operador

`%s%` <- function(x,y) x + y 

O podría ser más interesante, por ejemplo haciendo un segundo operador de la derivada:

`%DD%` <- function(expr, nam="x") { D(D(bquote(.(expr)), nam), nam) } 
expression(x^4) %DD% "x" 
# 4 * (3 * x^2) 

El % -character también tiene importancia en el El análisis de las funciones de formato de fecha, hora y tipo C, como strptime, formatC y sprintf.

Desde que se escribió originalmente, hemos visto la aparición del paquete magrittr con la elaboración dplyr que demuestra un uso más para los operadores con flanco %.

Así que la respuesta más general es que los símbolos % son manejados especialmente por el analizador R. Como el analizador se utiliza para procesar expresiones de gráficos, también verá amplias opciones para anotaciones de gráficos en la página de ayuda ?plotmath.

12

Una sola % signo no es una palabra clave en R. (Se puede ver una lista de los de la página ?Reserved ayuda.) En cambio, % denota un infixbinary operator. Hay varios operadores incorporados que usan %, y también puede crear los suyos propios.


¿Cómo consigo ayuda a los operadores binarios?

Al igual que con cualquier cosa que no sea un nombre de variable estándar, debe encerrar el término entre comillas o comillas inversas.

?"%in%" 
?`%in%`  

Crédito: GSee's answer.


¿Qué %in% hacer?

Como se describe en la página ?`%in%` ayuda (que en realidad es la página ?match ayuda ya %in% es en realidad sólo una versión infija de match.),

[%in%] devuelve un vector lógico que indica si hay una coincidencia o no para su operando izquierdo

Es el más comúnmente utilizado con variables categóricas, aunque también se puede usar con números.

c("a", "A") %in% letters 
## [1] TRUE FALSE 

1:4 %in% c(2, 3, 5, 7, 11) 
## [1] FALSE TRUE TRUE FALSE 

Crédito: GSee's answer, Ari's answer, Sathish's answer.


¿Cómo puedo crear mis propios operadores infijos binarias?

Estas son funciones, y se pueden definir de la misma manera que cualquier otra función, con un par de restricciones.

  1. Es un binario Opertor, por lo que la función debe tener exactamente dos argumentos.
  2. Como el nombre no es estándar, debe escribirse con comillas o comillas inversas.

Por ejemplo, esto define un operador de potencia de matriz.

`%^%` <- function(x, y) 
{ 
    matrixcalc::matrix.power(x, y) 
} 
matrix(1:4, 2) %^% 3 

Crédito: BondedDust's answer, Ari's answer.


¿Qué otros operadores % hay?

En base de R:

%/% y %% realizar integer division y modular division respectivamente, y se describen en la página ?Arithmetic ayuda.

%o% da el outer product de matrices.

%*% realiza matrix multiplication.

%x% realiza el Kronecker product de matrices.

En ggplot2:

%+% sustituye a la trama de datos en un ggplot.

%+replace% modifica los elementos del tema en un ggplot.

%inside% (interno) comprueba los valores en un rango.

%||% (interna) proporciona un valor predeterminado en el caso de NULL valores. Esta función también aparece internamente en devtools, reshape2, roxygen2 y knitr. (En knitr se llama %n%.)

En magrittr:

%>% tuberías el lado izquierdo en una expresión en el lado derecho.

%<>% canaliza el lado izquierdo en una expresión en el lado derecho, y luego asigna el resultado al objeto del lado izquierdo.

%T>% canaliza el lado izquierdo en una expresión en el lado derecho, que utiliza solo por sus efectos secundarios, devolviendo el lado izquierdo.

%,% crea una secuencia funcional.

%$% expone expone columnas de un data.frame o miembros de una lista.

En data.table:

%between% cheques para valores en un rango.

%chin% es como %in%, optimizado para vectores de caracteres.

%like% busca coincidencias de expresiones regulares.

En Hmisc:

%nin% devuelve el opuesto de %in%.

En devtools:

%:::% (internos) para crear una variable de un espacio de nombres pasado como una cadena.

En sp:

%over% realiza una unión espacial

En rebus (por ejemplo, que polígono corresponde a algunos puntos?):

%R% concatena elementos de un objeto regex.


De manera más general, se pueden encontrar todos los operadores en todos los paquetes instalados en su máquina usando:

library(magrittr) 

ip <- installed.packages() %>% rownames 
(ops <- setNames(ip, ip) %>% 
    lapply(
    function(pkg) 
    { 
     rdx_file <- system.file("R", paste0(pkg, ".rdx"), package = pkg) 
     if(file.exists(rdx_file)) 
     { 
     rdx <- readRDS(rdx_file) 
     fn_names <- names(rdx$variables) 
     fn_names[grepl("^%", fn_names)] 
     } 
    } 
) %>% 
    unlist 
) 
Cuestiones relacionadas