r tidyr

Completa el marco de datos con combinaciones de valores faltantes



tidyr (1)

Tengo una pregunta simple, que no puedo entender. Tengo un marco de datos con dos factores ( distance ) y años ( years ). Me gustaría completar todos los valores de years para cada factor por 0.

es decir de esto:

distance years area 1 NPR 3 10 2 NPR 4 20 3 NPR 7 30 4 100 1 40 5 100 5 50 6 100 6 60

toma esto:

distance years area 1 NPR 1 0 2 NPR 2 0 3 NPR 3 10 4 NPR 4 20 5 NPR 5 0 6 NPR 6 0 7 NPR 7 30 8 100 1 40 9 100 2 0 10 100 3 0 11 100 4 0 12 100 5 50 13 100 6 60 14 100 7 0

Intenté aplicar la función expand() :

library(tidyr) library(dplyr, warn.conflicts = FALSE) expand(df, years = 1:7)

pero esto solo produce una columna de datos y no expande la original:

# A tibble: 7 x 1 years <int> 1 1 2 2 3 3 4 4 5 5 6 6 7 7

o expand.grid() tampoco funciona:

require(utils) expand.grid(df, years = 1:7) Error in match.names(clabs, names(xi)) : names do not match previous names In addition: Warning message: In format.data.frame(x, digits = digits, na.encode = FALSE) : corrupt data frame: columns will be truncated or padded with NAs

¿Hay una forma sencilla de expand mi marco de datos? ¿Y cómo expandirlo en base a dos categorías: distance y uniqueLoc ?

distance <- rep(c("NPR", "100"), each = 3) years <-c(3,4,7, 1,5,6) area <-seq(10,60,10) uniqueLoc<-rep(c("a", "b"), 3) df<-data.frame(uniqueLoc, distance, years, area) > df uniqueLoc distance years area 1 a NPR 3 10 2 b NPR 4 20 3 a NPR 7 30 4 b 100 1 40 5 a 100 5 50 6 b 100 6 60


Puede utilizar la función complete :

complete(df, distance, years = full_seq(years, period = 1), fill = list(area = 0)) # A tibble: 14 x 3 distance years area <fct> <dbl> <dbl> 1 100 1. 40. 2 100 2. 0. 3 100 3. 0. 4 100 4. 0. 5 100 5. 50. 6 100 6. 60. 7 100 7. 0. 8 NPR 1. 0. 9 NPR 2. 0. 10 NPR 3. 10. 11 NPR 4. 20. 12 NPR 5. 0. 13 NPR 6. 0. 14 NPR 7. 30.

o ligeramente más corto:

complete(df, distance, years = 1:7, fill = list(area = 0))