2016-06-08 1 views
2

Я использую tidyr::complete() для включения отсутствующих строк в кадре данных со многими столбцами, что приводит к значениям NA. Как я могу указать параметр fill для замены значений NA на 0, если у меня нет явного списка имен столбцов?R/tidyr :: complete - заполнение отсутствующих значений динамически

Пример:

df <- data.frame(year = c(2010, 2013:2015), 
       age.21 = runif(4, 0, 10), 
       age.22 = runif(4, 0, 10), 
       age.23 = runif(4, 0, 10), 
       age.24 = runif(4, 0, 10), 
       age.25 = runif(4, 0, 10)) 

# replaces missing values with NA - not what I want 
df.complete <- complete(df, year = 2010:2015) 

# replaces missing values with 0 - works, but needs explicit list 
df.complete <- complete(df, year = 2010:2015, fill = list(age.21 = 0, age.22 = 0, 
                  age.23 = 0, age.24 = 0, 
                  age.25 = 0)) 


# throws error (is.list(replace) is not TRUE) 
df.complete <- complete(df, year = 2010:2015, fill = 0) 

# replaces missing values with NA - not what I want 
df.complete <- complete(df, year = 2010:2015, fill = list(rep(0,6))) 

Обходной может быть использование df.complete[is.na(df.complete)] <- 0, но это несет опасность замены слишком много значений.

ответ

3

Вот способ с изменением формы данных первыми:

df %>% 
    gather("var", "val", -year) %>% 
    complete(year = 2010:2015, var, fill = list(val = 0)) %>% 
    spread(var, val) 

Source: local data frame [6 x 6] 

    year age.21 age.22 age.23 age.24 age.25 
    (dbl) (dbl) (dbl)  (dbl) (dbl)  (dbl) 
1 2010 8.940997 7.787210 1.5747435 9.874449 5.2228670 
2 2011 0.000000 0.000000 0.0000000 0.000000 0.0000000 
3 2012 0.000000 0.000000 0.0000000 0.000000 0.0000000 
4 2013 2.965928 6.495460 0.8966319 2.849262 0.2430174 
5 2014 4.608676 1.946671 1.5765912 8.551907 0.3146824 
6 2015 7.359407 4.414294 4.3419163 4.082509 1.5770299 

 Смежные вопросы

  • Нет связанных вопросов^_^