Desde <-.data.table
no hace una copia, puede utilizar <-
:
crear un objeto data.table:
library(data.table)
di <- data.table(iris)
crear una nueva columna:
di <- di[, z:=1:nrow(di)]
di
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species z
# [1,] 5.1 3.5 1.4 0.2 setosa 1
# [2,] 4.9 3.0 1.4 0.2 setosa 2
# [3,] 4.7 3.2 1.3 0.2 setosa 3
# [4,] 4.6 3.1 1.5 0.2 setosa 4
# [5,] 5.0 3.6 1.4 0.2 setosa 5
# [6,] 5.4 3.9 1.7 0.4 setosa 6
# [7,] 4.6 3.4 1.4 0.3 setosa 7
# [8,] 5.0 3.4 1.5 0.2 setosa 8
# [9,] 4.4 2.9 1.4 0.2 setosa 9
# [10,] 4.9 3.1 1.5 0.1 setosa 10
# First 10 rows of 150 printed.
También vale la pena recordar que R solo imprime el valor de un objeto en interactiv e modo.
Así, en el modo por lotes, puede simplemente usar:
di[, z:=1:nrow(di)]
Esto no producirá salida, cuando se ejecuta como una secuencia de comandos en modo batch.
Más información de Mateo Dowle:
Véase también FAQ 2.21 y 2.22:
2,21 ¿Por qué DT[i,col:=value]
devolución de la totalidad de DT
? No esperaba ningún valor visible (consistente con <-
), o un mensaje o valor de retorno que contenía cuántas filas se actualizaron. No es obvio que los datos se hayan actualizado por referencia.
Para que la sintaxis compuesta pueda funcionar; por ejemplo, DT[i,done:=TRUE][,sum(done)]
. La cantidad de filas actualizadas se devuelve cuando la verbosidad está activada, ya sea por consulta o globalmente, usando options(datatable.verbose=TRUE)
.
2.22 Bien, pero ¿no se puede devolver el valor de retorno de DT[i,col:=value]
de forma invisible, entonces?
- Intentamos pero obliga R internamente para visibilidad en
[
. El valor de La columna de evaluación de FunTab (consulte src/main/names.c) para [
es 0
, que significa fuerza R_Visible
activada (consulte la sección 1.6 de R-Internals). Por lo tanto, cuando probamos invisible()
o estableciendo R_Visible
en 0
directamente con nosotros mismos, eval
en src/main/eval.c lo volvería a forzar.
- Después de acostumbrarse a este comportamiento, puede llegar a preferirlo (tenemos). Después de todo, ¿cuántas veces asignamos usando
<-
y luego miramos de inmediato los datos para verificar que estén correctos?
- Podemos mezclar
:=
en un j
que también devuelve datos; una actualización mixta y seleccione en una consulta. Para detectar si j
solo actualiza (y luego se comporta de manera diferente) podría ser confuso.
Segunda actualización de Mateo Dowle:
ahora hemos encontrado una solución y v1.8.3 ya no imprima el resultado cuando se utiliza :=
. Actualizaremos las preguntas más frecuentes 2.21 y 2.22.
Gracias! Usaré '<-' en ese caso. –
+10 No pensé en probar 'DT <-DT [i, col: = value]'. La repetición del nombre de la variable no es genial, pero funciona. Eso me da una idea de cómo hacer que 'DT [i, col: = value]' regrese de manera invisible: ahora aparece como [FR # 2128] (https://r-forge.r-project.org/tracker/index. php? func = detail & aid = 2128 & group_id = 240 & atid = 978), gracias! –
+1 para el poderoso hack inteligente + fragmento interesante de las preguntas frecuentes. –