使每年在大型数据集中包含 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
)
关于鲑鱼养殖 (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
)