Estoy tratando de aplicar una función a un grupo de columnas de datos de gran tamaño.mesa sin hacer referencia a cada uno de ellos individualmente.

a <- data.table(
  a=as.character(rnorm(5)),
  b=as.character(rnorm(5)),
  c=as.character(rnorm(5)),
  d=as.character(rnorm(5))
)
b <- c('a','b','c','d')

con el MWE anteriormente, este:

a[,b=as.numeric(b),with=F]

funciona, pero esto:

a[,b[2:3]:=data.table(as.numeric(b[2:3])),with=F]

no funciona. ¿Cuál es la forma correcta de aplicar el as.numeric función sólo las columnas 2 y 3 de a sin referirse a ellos de forma individual.

(En el conjunto de datos reales que hay decenas de columnas, de manera que no sería práctico)

También, si usted sólo quiere hacer referencia a varias columnas de índices, ,with=F] permite a j a de columna-por ejemplo, los índices de dt[, 2:3, with =F. Pero la aplicación de una función a cada uno le es más complicado, como por @mnel la respuesta.

OriginalEl autor Tahnoon Pasha | 2013-05-28

1 Comentario

  1. 42

    La idiomáticas enfoque es el uso de .SD y .SDcols

    Puede forzar la RHS a ser evaluados en la matriz del marco envolviendo en ()

    a[, (b) := lapply(.SD, as.numeric), .SDcols = b]

    Para las columnas 2:3

    a[, 2:3 := lapply(.SD, as.numeric), .SDcols = 2:3]

    o

    mysubset <- 2:3
    a[, (mysubset) := lapply(.SD, as.numeric), .SDcols = mysubset]
    Si desea utilizar el «por» agrupación de aquí, ¿eso tiene que ser incluido en avanzar, en mysubset?
    No, las columnas no están en .SD, que existen como valores individuales en el entorno en el que .SD es creado.
    Hola ¿cómo puedo usar esto si quiero aplicar la función en todas las columnas, pero ‘b’? Gracias!
    Usted todavía puede utilizar a[, (b[b != 'b']) := lapply(.SD, as.numeric), .SDcols = b[b != 'b']] entonces. Pero mySubset <- setdiff(b, 'b') seguido por a[, (mySubset) := lapply(.SD, as.numeric), .SDcols = mySubset] es más legible y parece sencillo

    OriginalEl autor mnel

Dejar respuesta

Please enter your comment!
Please enter your name here