Tengo un conjunto de datos con dos valores para cada date como este:

    date        x   y
1   2013-05-01  1   2
2   2013-05-02  2   2
3   2013-05-03  3   2

date está en el formato as.Date, utilizando el paquete lubridate.

Ahora quiero tener la mean de los dos valores, a excepción de un cierto período de tiempo, en el que quiero usar los valores de x.

He intentado lo siguiente:

mean=(x+y)/2

newdata=ifelse((data$date < 2013-10-01 | date$date > 2014-04-09), mean, x)

pero si se acaba de tomar la mean para todas las fechas.

Es posible el uso de un mayor/menor que el de las relaciones para las fechas?
Alguna sugerencia sobre cómo hacer este trabajo?

Gracias de antemano

  • Se puede utilizar un conjunto de datos reproducibles como las que ves al tipo data()? Por CIERTO, ¿a qué te refieres por «formato»… qué quieres decir algo acerca de la clase? as.Date es una función de base si he entendido bien, pero no es una clase y el formato de está dada por un origin declaración…
  • Me produce los datos de ejemplo con: date=c("2013-05-01", "2013-05-02", "2013-05-03", "2013-05-04") x=c(1,2,3,4) y=c(2,2,2,2) library(lubridate) date=as.Date(as.character(date), format="%Y-%m-%d") data=data.frame(date, x,y) por los cuales iba a cambiar por ejemplo a: mean=(x+y)/2 newdata=ifelse((date < 2013-05-02 | date > 2013-05-03), mean, x)
  • y sí, me refería a la clase. Nueva en R, lo siento 🙂 escribir class(date) resultados en Date
  • OK genial, gracias. Eso siempre ayuda al que rápidamente puede replicar sus pasos. Parece que tienes un par de otras personas activamente aportando soluciones tho, así que voy a dejar a ellos. No se preocupe acerca de la clase/formato de confusión. Bienvenido a R 🙂 Saludos.
InformationsquelleAutor Anne | 2014-09-05

2 Comentarios

  1. 4

    Parece que no son de fundición de la comparación de los valores como de las fechas. También las fechas que usted utilizó para la comparación no excluir a ninguna de las fechas en el dataframe que usted proporcionó, así que yo esperaría que la media para ser seleccionado en cada momento.

    date <- as.Date(c('2013-05-01', '2013-05-02', '2013-05-03'))
    x    <- c(1, 2, 3)
    y    <- c(2, 2, 2)
    mean <- (x + y)/2
    df   <- data.frame(date = date, x = x, y = y)
    newdata <- ifelse((df$date < as.Date('2013-05-02') | df$date > as.Date('2014-04-09')), mean, x)
    
    newdata

    He cambiado las fechas en la condición de ser más selectivos y tengo 1.5 2.0 3.0. Se selecciona el primer valor de mean y a los otros de x que está de acuerdo con la condición de que he utilizado en el ifelse().

    • has encontrado el error en mi código. Escogí como respuesta a medida que se corrija lo que ya hizo y su agradable y corto. Gracias!
    • Encantado de ayudar 🙂
    • ¿de dónde lubridate patada en exactamente?
  2. 2

    ¿Algo como esto:

    library(lubridate)
    library(data.table)
    ##
    set.seed(123)
    Data <- data.frame(
      date=as.Date(ymd(20130904))+0:364,
      x=as.numeric(sample(1:3,365,replace=TRUE)),
      y=as.numeric(sample(1:3,365,replace=TRUE)))
    setDT(Data)
    ##
    xSpan <- seq.Date(
      from=as.Date("2013-10-01"),
      to=as.Date("2014-04-09"),
      by="day")
    ##

    Editado se olvidó de grupo por date

    Data[,z:=ifelse(
      date %in% xSpan,
      x,
      mean(c(x,y))),
      by=date]
    ##
    > head(Data)
             date x y   z
    1: 2013-09-04 1 3 2.0
    2: 2013-09-05 3 1 2.0
    3: 2013-09-06 2 1 1.5
    4: 2013-09-07 3 2 2.5
    5: 2013-09-08 3 2 2.5
    6: 2013-09-09 1 2 1.5
    > head(subset(Data, date %in% xSpan))
             date x y z
    1: 2013-10-01 2 3 2
    2: 2013-10-02 1 3 1
    3: 2013-10-03 1 1 1
    4: 2013-10-04 3 1 3
    5: 2013-10-05 3 1 3
    6: 2013-10-06 3 1 3

    Me acaba de definir xSpan como una secuencia contigua de días para que una de las funciones se utiliza en (en tu ejemplo, la identidad de la función de x). Las fechas no incluidas en este lapso de tiempo se utilizan mean para determinar su valor de z.

    • lubridate no era necesario pero yo incluido por el ymd función y en caso de que usted está utilizando para otros fines.
    • esto funcionó, gracias 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here