Tengo un marco de datos donde algunos nombres de variables incluyen un "." extensión. Parece que R ignorará esta extensión y me dará la variable de todos modos si intento acceder a ella sin el nombre completo de la variable. ¿Qué está causando esto / por qué sucede? A continuación se muestra un mini ejemplo de mi problema.

y <- rnorm(100)
x <- rlnorm(100)

data <- cbind.data.frame(y,x)

colnames(data) <- c("y.rnorm","x.rlnorm")

# these both return the same thing
data$y
data$y.rnorm
4
user29609 1 dic. 2017 a las 01:47

2 respuestas

La mejor respuesta

R está configurado para proporcionar resultados a coincidencias parciales por diseño.

Lea la sección 3.4 y 4.3 de la R definición del lenguaje.

3.4.1 Carácter. Las cadenas de i se comparan con el atributo de nombres de x y se utilizan los enteros resultantes. Para [[ y $ se usa la coincidencia parcial si la coincidencia exacta falla, por lo que x$aa coincidirá con x$aabb si x no contiene un componente llamado "aa" y "aabb" es el único nombre que tiene el prefijo "aa". Para [[, la coincidencia parcial se puede controlar mediante el argumento exacto que por defecto es NA, lo que indica que se permite la coincidencia parcial, pero debería generar una advertencia cuando se produzca. Establecer exacto en TRUE evita que se produzca una coincidencia parcial, un valor FALSE lo permite y no emite ninguna advertencia. Tenga en cuenta que [ siempre requiere una coincidencia exacta. La cadena "" se trata de forma especial: indica "sin nombre" y no coincide con ningún elemento (ni siquiera con aquellos sin nombre). Tenga en cuenta que la coincidencia parcial solo se usa al extraer y no al reemplazar.

Y

4.3.2 Coincidencia parcial en etiquetas. Cada argumento proporcionado con nombre restante se compara con los argumentos formales restantes mediante una coincidencia parcial. Si el nombre del argumento proporcionado coincide exactamente con la primera parte de un argumento formal, se considera que los dos argumentos coinciden. Es un error tener múltiples coincidencias parciales. Observe que si f <- function(fumble, fooey) fbody, entonces f(f = 1, fo = 2) es ilegal, aunque el segundo argumento real solo coincide con fooey. Sin embargo, f(f = 1, fooey = 2) es legal ya que el segundo argumento coincide exactamente y se quita de consideración para la coincidencia parcial. Si los argumentos formales contienen "...", la coincidencia parcial solo se aplica a los argumentos que lo preceden.

Actualizar

Como señaló Uwe, puede haber una actualización pendiente de la definición del lenguaje R debido al comportamiento de [[ parcial la coincidencia ha cambiado. Un vistazo a R News muestra lo siguiente como < em> obsoleto y desaparecido con la versión 3.1.0:

La coincidencia parcial cuando se utiliza el operador $ en marcos de datos ahora genera una advertencia y puede desaparecer en el futuro. Si se desea una coincidencia parcial, reemplace foo$bar por foo[["bar", exact = FALSE]]

7
Kevin Arseneau 2 dic. 2017 a las 08:37

El operador $ está diseñado para realizar coincidencias parciales. Consulte el capítulo Subconjuntos de Advanced R por Hadley Wickham, Ctrl + F "coincidencia parcial":

Hay una diferencia importante entre $ y [[. $ hace coincidencia parcial:

x <- list(abc = 1)

x$a

## [1] 1

x[["a"]]

## NULL

Si desea evitar este comportamiento, puede establecer la opción global warnPartialMatchDollar en TRUE. Úselo con precaución: puede afectar el comportamiento de otro código que haya cargado (por ejemplo, de un paquete).

3
everetr 3 dic. 2017 a las 01:00