suggestions - how many hashtags are allowed on instagram
¿Cómo ejecuto aplicar en una tabla de datos? (2)
Tengo una data.table
con las columnas 2 a 20 como cadenas con espacios (por ejemplo, "Nombre de la especie"). Quiero ejecutar str_replace()
en todas esas columnas simultáneamente para que todo el "Nombre de la especie" se convierta en "Nombre de la especie". Yo tampoco puedo hacer:
data.table(apply(as.data.frame(dt[,2:dim(dt)[2], with=F]), 2,
function(x){ str_replace(x," ","_") }))
o si lo guardo como un objeto data.table
, entonces puedo hacer esto una columna a la vez:
dt[,SpeciesName := str_replace(SpeciesName, " ", "_")
¿Cómo hago esto para todas las columnas 2 hasta el final similar a la de la anterior?
Puedes hacerlo:
library("stringr")
dt[, -1] <- lapply(dt[, -1], function(x) str_replace(x," ","_"))
Completamente reescrito el 2015-11-24, para corregir un error en versiones anteriores.
Tienes pocas opciones.
Procese todas las columnas de destino con una llamada incorporada a
lapply()
, utilizando:=
para asignar los valores modificados en su lugar. Esto se basa en el muy práctico soporte de:=
para la asignación simultánea a varias columnas nombradas en su LHS.Use un bucle
for
para ejecutar las columnas de destino una a la vez, usandoset()
para modificar el valor de cada una.Use un bucle
for
para iterar sobre múltiples llamadas "ingenuas" a[.data.table()
, cada una de las cuales modifica una sola columna.
Todos estos métodos parecen igualmente rápidos, por lo que el que uses será principalmente cuestión de gustos. (1) es muy compacto y expresivo. Es lo que uso con más frecuencia, aunque puede encontrar (2) más fácil de leer. Debido a que procesan y modifican las columnas de una en una, (2) o (3) tendrán una ventaja en la rara situación en la que su tabla de datos es tan grande que corre el peligro de toparse con los límites impuestos por su R Memoria disponible de la sesión.
library(data.table)
## Create three identical 1000000-by-20 data.tables
DT1 <- data.table(1:1e6,
as.data.table(replicate(1e6, paste(sample(letters, nr, TRUE),
sample(letters, nr, TRUE)))))
cnames <- c("ID", paste0("X", 1:19))
setnames(DT1, cnames)
DT2 <- copy(DT1); DT3 <- copy(DT1)
## Method 1
system.time({
DT1[, cnames[-1] := lapply(DT1[,cnames[-1],with=FALSE],
function(x) gsub(" ", "_", x))]
})
## user system elapsed
## 10.90 0.11 11.06
## Method 2
system.time({
for(cname in cnames[-1]) {
set(DT2, j=cname, value=gsub(" ", "_", DT2[[cname]]))
}
})
## user system elapsed
## 10.65 0.05 10.70
## Method 3
system.time({
for(cname in cnames[-1]) {
DT3[ , cname := gsub(" ", "_", DT3[[cname]]), with=FALSE]
}
})
## user system elapsed
## 10.33 0.03 10.37
Para obtener más detalles sobre set()
y :=
, lea la página de ayuda que se obtiene al escribir ?set
o ?":="
.