2010-07-30 17 views
18

¿Dónde puedo encontrar información sobre las diferencias entre la llamada en una columna dentro de una hoja.de.datos a través de:

df <- data.frame(x=1:20,y=letters[1:20],z=20:1) 

df$x 
df["x"] 

Ambos devuelve los "mismos" resultados, pero no necesariamente en el mismo formato. Otra cosa que he notado es que df $ x devuelve una lista. Mientras que df ["x"] devuelve un data.frame.

EDITAR: Sin embargo, saber cuál usar en qué situación se ha convertido en un desafío. ¿Existe una mejor práctica aquí o realmente se trata de saber qué requiere el comando o la función? Hasta ahora, he estado revisándolos si mi función no funciona al principio (prueba y error).

Respuesta

13

Si no me equivoco, df$x es lo mismo que df[['x']]. [[ se utiliza para seleccionar cualquier elemento individual, mientras que [ devuelve una lista de los elementos seleccionados. Vea también the language reference. Normalmente veo que [[se usa para listas, [para matrices y $ para obtener una sola columna o elemento. Si necesita una expresión (por ejemplo, df [[nombre]] o df [, nombre]), utilice la notación [o [[también]. La [notación también se usa si se seleccionan varias columnas. Por ejemplo df [, c ('nombre1', 'nombre2')]. No creo que haya una mejor práctica para esto.

+0

if 'df <- data.frame (xx = 1); df $ x! = df [['x'] 'como descubrí aquí: http://stackoverflow.com/q/17349485/199217 –

0

df$x y df[[x]] hacen lo mismo.

Supongamos que tiene un conjunto de datos llamado one. Una de estas variables es una variable de factor, Region. El uso de one$Region le permitirá seleccionar una variable específica. Tenga en cuenta lo siguiente:

one <- read.csv("IED.csv") 
one$Region 

La ejecución del siguiente código también le permite aislar esa variable/nivel.

one[["Region"]] 

Cada código produce el siguiente resultado:

> one$Region 
    [1] RC SOUTH  RC SOUTH  RC SOUTH  RC EAST  RC EAST  
    [6] RC EAST  RC EAST  RC EAST  RC EAST  RC EAST  
    [11] RC SOUTH  RC SOUTH  RC EAST  RC EAST  RC EAST  
    [16] RC EAST  RC EAST  RC SOUTH  RC SOUTH  RC EAST  
    [21] RC SOUTH  RC EAST  RC CAPITAL RC EAST  RC EAST 


> one[["Region"]] 
    [1] RC SOUTH  RC SOUTH  RC SOUTH  RC EAST  RC EAST  
    [6] RC EAST  RC EAST  RC EAST  RC EAST  RC EAST  
    [11] RC SOUTH  RC SOUTH  RC EAST  RC EAST  RC EAST  
    [16] RC EAST  RC EAST  RC SOUTH  RC SOUTH  RC EAST  
    [21] RC SOUTH  RC EAST  RC CAPITAL RC EAST  RC EAST 

"Ambos regresan los 'mismos resultados', pero no necesariamente en el mismo formato." - No noté ninguna diferencia. Cada comando produjo los mismos resultados en el mismo formato. Tal vez sean sus datos.

Espero que ayude.

EDIT:

Misread la pregunta original. df["x"] produce lo siguiente:

> one["Region"] 
      Region 
1   RC SOUTH 
2   RC SOUTH 
3   RC SOUTH 
4   RC EAST 
5   RC EAST 
6   RC EAST 
7   RC EAST 
8   RC EAST 
9   RC EAST 
10   RC EAST 

No estoy seguro de por qué se produce la diferencia.

+0

No notó ninguna diferencia porque está viendo algo ligeramente diferente a sobre lo que preguntó. La pregunta es sobre la diferencia entre df $ x y df ["x"] (corchetes individuales), pero estamos hablando de df $ x y df [["x"]] (DOBLE corchetes). – Fojtasek

16

Otra diferencia es que df$w devuelve y df['w'] o df[['w']] da un error con su marco de datos de ejemplo.

+2

Este es un punto crucial. – Shane

+0

Sí, una consideración es si desea que silencie de manera silenciosa si escribió mal el nombre de la columna. Durante el desarrollo, esto generalmente es muy indeseable, por lo que desea detectar el error. – smci

5

Si usa df [, "x"] en lugar de df ["x"] obtendrá el mismo resultado que df $ x. La coma indica que está seleccionando una columna por su nombre.

9

Además de la página de indización en el manual, puede encontrar esta breve descripción en la página de ayuda."$":

Indexing por ‘[’ es similar a atómicos vectores y selecciona una lista del elemento especificado (s).

Ambos '[[' y '$' seleccionan un solo elemento de la lista. La diferencia principal de es que '$' no permite índices calculados, mientras que '[[' sí. 'x $ name' es equivalente a 'x [[' 'nombre' ', exacto = FALSE]]'. Además, el comportamiento de coincidencia parcial de de '[[' puede ser controlado mediante el argumento 'exacto'.

Las llamadas a funciones son, por supuesto, diferentes. Ver get("[.data.frame")get("[[.data.frame") frente a frente get("$")

7

En este caso, para la mayoría de usos, yo evitaría subajustes por completo y tratando de recordar lo $, [ y [[ ver con una trama de datos. Yo sólo tiene que utilizar with():

> df <- data.frame(x = 1:20, y = letters[1:20], z = 20:1) 
> with(df, y) 
[1] a b c d e f g h i j k l m n o p q r s t 
Levels: a b c d e f g h i j k l m n o p q r s t 

Eso es mucho más claro que cualquiera de los métodos subajustes en la mayoría de los casos (en mi humilde opinión).

6

Una cosa que no he visto explicado explícitamente es que [ y [[ se puede utilizar para seleccionar basado en el valor de una variable o expresión mientras $ no puede. I.E que puede hacer:

> example_frame <- data.frame(Var1 = c(1,2), Var2 = c('a', 'b')) 
> x <- 'Var1' 

> example_frame$x 
NULL # Not what you wanted 

> example_frame[x] 
    Var1 
1 1 
2 2 

> example_frame[[x]] 
[1] 1 2 

> example_frame[[ paste(c("V","a","r",2), collapse='') ]] 
[1] a b 
Levels: a b 

Las diferencias entre [ y [[ han sido bien cubierto por other posts y other questions.

+1

Curiosamente, * 'example_frame $ 'Var1'' * funciona todavía *' example_frame $ x' * falla. – smci

Cuestiones relacionadas