我有一个国家和年份级别的面板数据集,我想根据现有变量创建两个新变量。
| 年 | 国家 | 变量1 | 变量2 | 变量3 | 变种4 | 平均值_var1 | relmean_var1 |
|---|---|---|---|---|---|---|---|
| 1910年 | 德国大学 | 1 | 4 | 10 | 6 | 3 | 0.333 |
| 1911年 | 德国大学 | 2 | 3 | 11 | 7 | 1.5 | 1.3333 |
| 1910年 | 法国航空协会 | 5 | 6 | 8 | 9 | 3 | 1.66667 |
| 1911年 | 法国航空协会 | 1 | 4 | 10 | 9 | 1.5 | .66667 |
我想做的是创建两个新的变量集:(1)每年(跨国家)平均值的变量集和(2)相对于年平均值的国家/地区值的变量集。例如,对于 var1(1) 将产生mean_var1和(2)relmean_var1,我希望这些用于所有其他变量。数据集中总共有超过 1000 个变量,但我只会将此函数应用于大约 6 个变量。
我有适用于第一部分的代码,但我想将其尽可能有效地与第二部分结合起来。
library(dplyr)
library(purrr)
df<- df%>%
group_by(year) %>%
mutate_at(.funs = list(mean = ~mean(.)), .vars = c("var1", "var1", "var1", "var4"))
Run Code Online (Sandbox Code Playgroud)
此代码生成名为 var1_mean 的新变量(我更喜欢mean_var1:如何更改此名称?)
对于第二步,我尝试过:
df <- df %>%
map2_dfr(.x = d.test %>%
select(var1, var2), …Run Code Online (Sandbox Code Playgroud) 我想要一个对象,它为我提供从 1990-01-01 到 2021-12-31 的每个月(或季度)的日期范围,并用冒号分隔。例如,在每月的情况下,第一个对象将是 1990-01-01:1990-01-31,第二个对象将是 1990-02-01:1990-02-31,依此类推。
我遇到的问题是确保日期范围是排他的,即没有重复的日期。
start_date1 <- as.Date("1990-01-01", "%Y-%m-%d")
end_date1 <- as.Date("2021-12-01", "%Y-%m-%d")
first_date <- format(seq(start_date1,end_date1,by="month"),"%Y-%m-%d")
start_date2 <- as.Date("1990-02-01", "%Y-%m-%d")
end_date2 <- as.Date("2022-01-01", "%Y-%m-%d")
second_date <- format(seq(start_date2,end_date2,by="month"),"%Y-%m-%d")
date<-paste0(first_date, ":")
finaldate<-paste0(date, second_date)
Run Code Online (Sandbox Code Playgroud)
此代码有效,除了每个月的第一个日期重复“1990-01-01:1990-02-01”“1990-02-01:1990-03-01”,最后一个日期是“2021- 12-01:2022-01-01”(包括 2022 年 1 月 1 日,而不是停止于 2021 年 12 月 31 日。
如果我改为 30 天,效果就不太好,因为不是每个月都有 30 天。
获得独家日期范围的最佳方式是什么?