es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Data.table de R: ¿cómo utilizar variables de R que contienen nombres de columnas?

He leído la documentación de data.table varias veces pero aún no entiendo cómo hacer algunas operaciones; en general, aún no entiendo la “filosofía” subyacente sobre cómo trabajar con nombres de variables. Considera este problema de ejemplo:

Tengo una tabla de datos con variables ‘a’, ‘b’, ‘c’, ‘d’:

> dt <- data.table(a=c(1,1,2), b=1:3, c=11:13, d=21:23)
> dt
   a b  c  d
1: 1 1 11 21
2: 1 2 12 22
3: 2 3 13 23

Supongamos que mi script le pide al usuario que ingrese un nombre de columna y el valor correspondiente que se debe usar para seleccionar filas. Estas dos variables se almacenan en rowselectname y rowselectvalue:

> rowselectname
[1] "a"
> rowselectvalue
[1] 1

El script también le pide al usuario que seleccione algunos nombres de filas de interés; sus nombres se almacenan en colselectnames:

> colselectnames
[1] "b" "d"

Ahora quiero crear una nueva tabla de datos a partir de dt, con las filas para las cuales rowselectname tiene el valor rowselectvalue, y con las columnas dadas por colselectnames. La única forma en que finalmente logré hacer esto es la siguiente:

> newdt <- dt[get(rowselectname)==rowselectvalue, ..colselectnames]
> newdt
   b  d
1: 1 21
2: 2 22

Lo que no entiendo es por qué tengo que usar get() para la primera selección y .. para la segunda. ¿Por qué no get() para ambos (no funciona)? ¿O por qué no .. para ambos (también no funciona)? Esto me parece inconsistente, pero tal vez hay otra forma de hacer esto con una sintaxis más coherente. Creo que lo más obvio debería ser simplemente newdt <- dt[rowselectname==rowselectvalue, colselectnames], que es como funciona el resto de R.

Agradecería que alguien me explique cómo ver esto para entender la sintaxis.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que se utiliza get() para la primera selección y .. para la segunda es porque cumplen diferentes propósitos.

    get() se utiliza para evaluar el valor de una variable que está guardada como una cadena de texto. En este caso, rowselectname es una cadena de caracteres y queremos usar su valor como nombre de columna en la tabla de datos. Por lo tanto, utilizamos get() para evaluar su valor y usarlo como nombre de columna en la instrucción de selección.

    Por otro lado, .. se utiliza para seleccionar columnas dinámicamente evaluando los nombres de columna guardados en un vector de caracteres. En este caso, colselectnames es un vector de caracteres que contiene los nombres de las columnas que queremos seleccionar. Por lo tanto, utilizamos .. para evaluar el vector y seleccionar esas columnas dinámicamente.

    Si deseas utilizar una sintaxis más consistente, puedes utilizar la función with para especificar la tabla de datos una vez y luego referirte a las columnas utilizando sus nombres sin necesidad de usar get() o ... Aquí tienes un ejemplo:

    newdt <- with(dt, .SD[rowselectname == rowselectvalue, colselectnames])
    

    En este caso, .SD es una variable especial que se refiere a la propia tabla de datos, y with() se utiliza para especificar que queremos referirnos a las columnas de esa tabla de datos sin tener que utilizar la sintaxis dt$.

Comments are closed.