Tengo un marco de datos, df, así:

df
        date periodNumber  value
1 2020-02-02            0   814
2 2020-02-09            0  1592
3 2020-02-09            1  1808
4 2020-02-16            0  2746
5 2020-02-16            1  2646
6 2020-02-16            2  2993

str(df)
'data.frame':   6 obs. of  3 variables:
 $ date        : Date, format: "2020-02-02" "2020-02-09" "2020-02-09" "2020-02-16" ...
 $ periodNumber: int  0 0 1 0 1 2
 $ value       : num  814 1592 1808 2746 2646 2993

Como puede verse, df$date tiene el formato Date. Tengo un bucle for para agregar filas a este marco de datos, así:

for(i in 1:nrow(df)){
  df[nrow(df)+1,] <- c(df$date[i]+1, df$periodNumber[i], df$periodNumber[i])
}

Sin embargo, esto da el error Error in as.Date.numeric(e) : 'origin' must be supplied. ¿Por qué es esto? El ciclo funciona si elimino la columna Date. También probé versiones de agregar as.Date() al ciclo for, pero eso da el mismo error. Por ejemplo, el siguiente código da el mismo error:

for(i in 1:nrow(df)){
  df[nrow(df)+1,] <- c(as.Date(df$date[i], origin='1970-01-01')+1, df$periodNumber[i], df$periodNumber[i])
}
1
Gaurav Bansal 22 ene. 2021 a las 20:34

1 respuesta

La mejor respuesta

El c en el ciclo for quiere coaccionar los tres valores en un solo formato.

En ?c podemos leer:

El tipo de salida se determina a partir del tipo más alto de los componentes en la jerarquía NULL

De hecho, no estoy seguro de dónde "Date" se puede clasificar la fecha aquí. Uno podría esperar que fuera forzado a numérico , pero es fecha . Y debido a que no se proporciona origin= (¿dónde debería definirse realmente?), Arroja un error.

Esto es realmente interesante, ya que

c(1, as.Date("2020-01-01"))
# [1]     1 18262

Pero

c(as.Date("2020-01-01"), 1)
# Error in as.Date.numeric(e) : 'origin' must be supplied

Esto es al menos una inconsistencia, tal vez un error, no pude encontrar ninguna documentación.

De todos modos , use data.frame para permitir varias clases.

for(i in 1:nrow(df)){
  df[nrow(df)+1,] <- data.frame(df$date[i]+1, df$periodNumber[i], df$periodNumber[i])
}
#          date periodNumber value
# 1  2020-02-02            0   814
# 2  2020-02-09            0  1592
# 3  2020-02-09            1  1808
# 4  2020-02-16            0  2746
# 5  2020-02-16            1  2646
# 6  2020-02-16            2  2993
# 7  2020-02-03            0     0
# 8  2020-02-10            0     0
# 9  2020-02-10            1     1
# 10 2020-02-17            0     0
# 11 2020-02-17            1     1
# 12 2020-02-17            2     2

Datos:

df <- structure(list(date = structure(c(18294, 18301, 18301, 18308, 
18308, 18308), class = "Date"), periodNumber = c(0L, 0L, 1L, 
0L, 1L, 2L), value = c(814L, 1592L, 1808L, 2746L, 2646L, 2993L
)), row.names = c("1", "2", "3", "4", "5", "6"), class = "data.frame")
1
jay.sf 22 ene. 2021 a las 18:06