2016-06-01 23 views
0

Ich habe eine große data.frame von Blumen und Früchten in einer Anlage für eine 30-jährige Umfrage. Ich möchte in einigen Zeilen Nullen (0) hinzufügen, die Individuen in bestimmten Monaten darstellen, in denen die Pflanze keine flowers oder fruits hatte (weil es eine saisonale Spezies ist).Hinzufügen von Zeilen zu data.frame bedingt

Beispiel:

Year Month Flowers Fruits 
2004 6  25  2 
2004 7  48  4 
2005 7  20  1 
2005 8  16  1 

Ich mag die Monate hinzuzufügen, die nicht mit Werten von Null enthalten ist, so war ich in einer Funktion zu denken, dass die fehlenden Monate und füllen sie mit 0.

Dank erkennen .

+0

Siehe https://stackoverflow.com/questions/46377613/filling-missing- Monat-in-Zeit-Serie-mit-Na/46378470 # 46378470 –

Antwort

2
## x is the data frame you gave in the question 

x <- data.frame(
    Year = c(2004, 2004, 2005, 2005), 
    Month = c(6, 7, 7, 8), 
    Flowers = c(25, 48, 20, 16), 
    Fruits = c(2, 4, 1, 1) 
) 

## y is the data frame that will provide the missing values, 
## so you can replace 2004 and 2005 with whatever your desired 
## time interval is 

y <- expand.grid(Year = 2004:2005, Month = 1:12) 

## this final step fills in missing dates and replaces NA's with zeros 

library(tidyr) 
x <- merge(x, y, all = TRUE) %>% 
    replace_na(list(Flowers = 0, Fruits = 0)) 

## if you don't want to use tidyr, you can alternatively do 

x <- merge(x, y, all = TRUE) 
x[is.na(x)] <- 0 

Es sieht wie folgt aus:

head(x, 10) 

# Year Month Flowers Fruits 
# 1 2004  1  0  0 
# 2 2004  2  0  0 
# 3 2004  3  0  0 
# 4 2004  4  0  0 
# 5 2004  5  0  0 
# 6 2004  6  25  2 
# 7 2004  7  48  4 
# 8 2004  8  0  0 
# 9 2004  9  0  0 
# 10 2004 10  0  0 
+0

Vielen Dank, das ist genau das, was ich gesucht habe. –

1

Hier ist eine weitere Option expand und left_join

library(dplyr) 
library(tidyr) 
expand(df1, Year, Month = 1:12) %>% 
     left_join(., df1) %>% 
     replace_na(list(Flowers=0, Fruits=0)) 
# Year Month Flowers Fruits 
# <int> <int> <dbl> <dbl> 
#1 2004  1  0  0 
#2 2004  2  0  0 
#3 2004  3  0  0 
#4 2004  4  0  0 
#5 2004  5  0  0 
#6 2004  6  25  2 
#7 2004  7  48  4 
#8 2004  8  0  0 
#9 2004  9  0  0 
#10 2004 10  0  0 
#.. ... ...  ... ...