2016-10-10 2 views
3

Позволяет делать вид, у меня есть что-то вроде этого:Как заполнить недостающие уровни факторов в кадре данных?

df <- data.frame(
     PERSON = c("Peter", "Peter", "Marcel" , "Lisa", "Lisa"),   
     FRUIT = c("Apple", "Peach","Apple", "Apple", "Peach"), 
     A = c(100, 200, 100, 200, 300), 
     B=c(1,2,3,4,5)) 
df$PERSON <- as.factor(df$Person) 
df$FRUIT <- factor(df$FRUIT, levels = c("Apple", "Peach", "Coconut")) 

Какой resulsts в

str(df): 'data.frame': 5 obs. of 4 variables: 
$ PERSON: Factor w/ 3 levels "Lisa","Marcel",..: 3 3 2 1 1 
$ FRUIT : Factor w/ 3 levels "Apple","Peach",..: 1 2 1 1 2 
$ A  : num 100 200 100 200 300 
$ B  : num 1 2 3 4 5 

Я хочу, чтобы расширить эти данные, кадр так, что для каждого человека есть все уровни FRUIT настоящее, как это :

Person FRUIT A B 
1 Peter Apple 100 1 
2 Peter Peach 200 2 
3 Peter Coconut 0 0 
4 Marcel Apple 100 3 
5 Marcel Peach 0 0 
6 Marcel Coconut 0 0 
7 Lisa Apple 200 4 
8 Lisa Peach 300 5 
9 Lisa Coconut 0 0 

Пропущенные значения для A и B должны быть заполнены 0.

Я пробовал tidyr::complete(df$FRUIT, 0), но, похоже, я использовал эту функцию неправильно.

Заранее спасибо

+0

уточните, что вы используете полную упаковку из упаковки 'tidyr'. – agenis

ответ

9

The complete принимает первый аргумент как 'данные', а затем по столбцам расширяться. По умолчанию fill является NA, но мы можем изменить его на 0, указав его в list.

complete(df, PERSON, FRUIT, fill = list(A=0, B = 0)) 
+0

Он работает, спасибо. Можно ли также создать список на основе имен столбцов? В настройке реального мира количество столбцов, которые должны быть заполнены 0, равно 20. Таким образом, существует много типов для ввода – barracuda317

+0

@ barracuda317 В этом случае попробуйте 'complete_' i.e.' library (dplyr); complete_ (df, names (df) [1: 2])%>% mutate_each (funs (replace (., is.na (.), 0)), A: B) ' – akrun

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