2016-07-28 2 views
1

Я хотел бы добавить новые строки в кадр данных, с которым я работаю, на основе данных, отсутствующих в фреймворке данных.Как создать новые строки в кадре данных на основе отсутствующих данных в R

Вот пример dataframe.

year <- c(2001,2001,2002,2002,2003,2004,2004,2005) 
make <- c('Honda', 'Ford', 'Honda', 'Ford', 'Honda', 'Honda', 'Ford', 'Honda') 
number_manufactured <- c(10, 20, 15, 47, 14, 19, 35, 9) 

cars <- data.frame(year, make, number_manufactured) 

Я хотел бы добавить строку кадра данных для значений, которые отсутствуют в number_manufactured = 0, таких как: (2003, Форд, 0) и (2005, Форд, 0)

Мой желаемый фрейм данных будет таким:

year <- c(2001,2001,2002,2002,2003,2003,2004,2004,2005,2005) 
make <- c('Honda', 'Ford', 'Honda', 'Ford', 'Honda','Ford', 'Honda', 'Ford', 'Honda', 'Ford') 
number_manufactured <- c(10, 20, 15, 47, 14, 0, 19, 35, 9, 0) 

cars <- data.frame(year, make, number_manufactured) 

Спасибо за помощь!

ответ

1

Вот базовый метод R, использующий expand.grid и merge.

# get new data.frame 
dfNew <- merge(cars, expand.grid(unique(cars$year), unique(cars$make)), 
       by.x=c("year", "make"), by.y=c("Var1", "Var2"), all=TRUE) 
# fill in 0s 
dfNew$number_manufactured[is.na(dfNew$number_manufactured)] <- 0 

expand.grid возвращает data.frame со всеми комбинациями двух векторов. Здесь он получает уникальные уровни года и делает. это слияние с исходным data.frame для создания нового data.frame, с новыми наблюдениями, включающими использование аргумента all = TRUE. Новые наблюдения - это NA для числа произведенных, поэтому вторая строка преобразует их в 0s.

+0

Это сработало красиво. Спасибо!!! –

0

tidyr::complete удобен для такого рода вещей. Вы перечисляете переменные в наборе данных, для которого вы хотите добавить строки. Вы также можете указать, что хотите заполнить другими переменными (по умолчанию вы получаете NA) через fill.

library(tidyr) 
complete(cars, year, make, fill = list(number_manufactured = 0)) 
0

Эта простая команда tidyr сохраняет весь день. Большое спасибо за то, что поделились своими знаниями.

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