有条件地向data.frame添加行

时间:2016-06-01 22:23:29

标签: r function conditional rows rbind

我在植物中有一个很大的data.frame花和果实进行了30年的调查。我想在某些行中添加零(0),这些行代表植物没有flowersfruits的特定月份中的个体(因为它是季节性物种)。

示例:

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

我想添加零值未包含的月份,所以我在一个能识别缺失月份并用0填充它们的函数中思考。

感谢。

2 个答案:

答案 0 :(得分:3)

## 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

看起来像这样:

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

答案 1 :(得分:1)

以下是使用expandleft_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
#..   ...   ...     ...    ...