2016-10-10 73 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")) 

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 

我希望讓每個人有本發明的水果的各個層面,這樣的擴大這個數據,幀裏面resulsts :爲AB

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 

缺失值應填充0

我試過tidyr::complete(df$FRUIT, 0),但看起來,我用這個函數是錯誤的。

預先感謝

+0

請指定您使用套件'tidyr'的完整功能。 – agenis

回答

9

complete取第一參數作爲「數據」,隨後的列擴展。默認情況下,fill是NA,但我們可以通過在list中指定它將其更改爲0。

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

它的工作原理,謝謝。是否也可以根據列名建立列表?在現實世界中,填充0的列數是20.所以輸入 – barracuda317

+0

@ barracuda317有很多,在這種情況下,請嘗試'complete_',即'library(dplyr); A:B)complete_(df,names(df)[1:2])%>%mutate_each(funs(替換(。,is.na(。),0)), – akrun