使每年在大型数据集中包含 12 个月

Making every year contain 12 months in a large dataset

关于鲑鱼养殖 (2005-2020),我有大量 data.frame 变量。它包含 15 年来来自数百个不同农场 (org_anonym) 的数据。但是,许多农场缺少某些月份或有重复的月份。我该如何写才能使每个位置的每年都有 12 个月,顺序为 1-12?

示例:

在此示例中,农场 126 缺少 2005 年的第 12 个月,而 2006 年只有第 11 和 12 个月。有时同一年有连续两行同月。

我想要的结果是让所有位置的年份为 2005-2020,其中第 1-12 个月没有重复或缺失的月份(填充行中的数据可以是 0 或 NA)。

我没有一个直观的方法来执行此操作,因为错误是随机的。

请帮忙:)

这是一个类似的例子,我只使用“6 month year”,这样更易​​读。使用小示例更容易对内容进行排序。

library(plyr) # join and arrange function
# Example where i miss last month of 2005 
# and only have 2 first month for 2006
df <- data.frame( 
  year = c(rep(2005, 5), rep(2006, 2)), 
  month = c(1:5, 4, 5 ),
  value = 126)

# I create a data.frame of all coombination of year and month.
# You can replace year here by 2005:2020 and month by 1:12
tmp <- expand.grid(year = unique(df$year), month = 1:6) 

res <- join(tmp, df, type = "left") # join will add NA for missing values
res <- arrange(res, year, month, value) # arrange will order the rows.
res
#    year month value
# 1  2005     1   126
# 2  2005     2   126
# 3  2005     3   126
# 4  2005     4   126
# 5  2005     5   126
# 6  2005     6    NA
# 7  2006     1    NA
# 8  2006     2    NA
# 9  2006     3    NA
# 10 2006     4   126
# 11 2006     5   126
# 12 2006     6    NA

更简单的方法是使用函数 complete(),但这要求您的数据框至少每年和每月出现一次。在我的例子中,这不会完全起作用,因为我没有任何一年与“第六”月。

library(tidyr)
df %>% complete(year, month)

此外,complete() 只是 expand()join() 的包装,因此您最好了解第一个解决方案中发生的情况。

salmon %>% distinct(year) %>%
  mutate(month = list(1:12)) %>% 
  unnest(month) %>% 
  left_join(salmon, by=c("year", "month")

如果你想把org_acronym也带过去,只要把上面的改成distinct(year, acronym)即可。

如果您想要 2005:2020 的所有年份,只需将上面的内容更改为

tibble(year=2005:2020) %>% 
  mutate(month=list(1:12)) %>% 
  unnest(month) %>% 
  left_join(salmon)

输出:

   year month org_acronym
1  2005     1         126
2  2005     2         126
3  2005     3         126
4  2005     4         126
5  2005     5         126
6  2005     6         126
7  2005     7         126
8  2005     8         126
9  2005     9         126
10 2005    10         126
11 2005    11         126
12 2005    12          NA
13 2006     1          NA
14 2006     2          NA
15 2006     3          NA
16 2006     4          NA
17 2006     5          NA
18 2006     6          NA
19 2006     7          NA
20 2006     8          NA
21 2006     9          NA
22 2006    10          NA
23 2006    11         126
24 2006    12         126
25 2007     1         126
26 2007     2          NA
27 2007     3          NA
28 2007     4          NA
29 2007     5          NA
30 2007     6          NA
31 2007     7          NA
32 2007     8          NA
33 2007     9          NA
34 2007    10          NA
35 2007    11          NA
36 2007    12          NA

输入:

salmon  =tibble(
  year = c(rep(2005,11), rep(2006,2),2007),
  month = c(seq(1:11), 11,12,1),
  org_acronym = 126
)