mtext ggplot change r dataframe self-reference

ggplot - r plot scale



R auto referencia (4)

En RI me encuentro haciendo algo como esto mucho:

adataframe[adataframe$col==something]<-adataframe[adataframe$col==something)]+1

Esta forma es larga y tediosa. ¿Hay alguna manera para mí
para hacer referencia al objeto que estoy tratando de cambiar, como

adataframe[adataframe$col==something]<-$self+1

?


Deberías prestar más atención a Gabor Grothendeick (y no solo en este caso). La función citada inc en el blog de Matt Asher hace todo lo que estás preguntando:

(Y la extensión obvia también funciona).

add <- function(x, inc=1) { eval.parent(substitute(x <- x + inc)) } # Testing the `inc` function behavior

EDITAR: Después de mi molestia temporal por la falta de aprobación en el primer comentario, tomé el desafío de agregar otro argumento funcional. Suministrado con un argumento de una parte de un marco de datos, aún aumentaría el rango de valores en uno. Hasta este punto solo se ha probado muy poco en los operadores de infija dyadic, pero no veo ninguna razón para que no funcione con ninguna función que acepte solo dos argumentos:

transfn <- function(x, func="+", inc=1) { eval.parent(substitute(x <- do.call(func, list(x , inc)))) }

(Admisión culpable: esto de alguna manera "se siente mal" desde la perspectiva tradicional de R de devolver valores para la asignación.) Las pruebas anteriores en la función inc están a continuación:

> df <- data.frame(a1 =1:10, a2=21:30, b=1:2) > inc <- function(x) { + eval.parent(substitute(x <- x + 1)) + } > inc(df$a1) # works on whole columns > df a1 a2 b 1 2 21 1 2 3 22 2 3 4 23 1 4 5 24 2 5 6 25 1 6 7 26 2 7 8 27 1 8 9 28 2 9 10 29 1 10 11 30 2 > inc(df$a1[df$a1>5]) # testing on a restricted range of one column > df a1 a2 b 1 2 21 1 2 3 22 2 3 4 23 1 4 5 24 2 5 7 25 1 6 8 26 2 7 9 27 1 8 10 28 2 9 11 29 1 10 12 30 2 > inc(df[ df$a1>5, ]) #testing on a range of rows for all columns being transformed > df a1 a2 b 1 2 21 1 2 3 22 2 3 4 23 1 4 5 24 2 5 8 26 2 6 9 27 3 7 10 28 2 8 11 29 3 9 12 30 2 10 13 31 3 # and even in selected rows and grepped names of columns meeting a criterion > inc(df[ df$a1 <= 3, grep("a", names(df)) ]) > df a1 a2 b 1 3 22 1 2 4 23 2 3 4 23 1 4 5 24 2 5 8 26 2 6 9 27 3 7 10 28 2 8 11 29 3 9 12 30 2 10 13 31 3


Esto es lo que puedes hacer. Digamos que tienes un marco de datos

df = data.frame(x = 1:10, y = rnorm(10))

Y desea incrementar todo y en 1. Puede hacerlo fácilmente usando la transform

df = transform(df, y = y + 1)


Pruebe el paquete data.table y su operador := . Es muy rápido y muy corto.

DT[col1==something, col2:=col3+1]

La primera parte col1==something es el subconjunto. Puede poner algo aquí y usar los nombres de las columnas como si fueran variables; es decir, no es necesario usar $ . Luego, la segunda parte col2:=col3+1 asigna el RHS al LHS dentro de ese subconjunto, donde los nombres de las columnas se pueden asignar como si fueran variables. := es asignación por referencia. No se toman copias de ningún objeto, por lo que es más rápido que <- , = , within y se transform .

Además, pronto se implementará en v1.8.1, un objetivo final de la sintaxis de j permite := en j así que se está combinando con by , vea la pregunta: ¿ cuándo debería usar el operador := en data.table .

UDPDATE: Eso fue liberado ( := por grupo) en julio de 2012.


Sería parcial (presumiblemente el subconjunto está en las filas)

ridx <- adataframe$col==something adataframe[ridx,] <- adataframe[ridx,] + 1

que no se basa en ningún análisis sofisticado / frágil, es razonablemente expresivo sobre la operación que se realiza y no es demasiado detallado. También tiende a dividir las líneas en unidades agradablemente analizables por el ser humano, y hay algo atractivo sobre el uso de modismos estándar: el vocabulario e idiosincrasias de R ya son lo suficientemente grandes para mi gusto.