使用R和dplyr:

library(dplyr)

tab1 <- tribble(
  ~code, ~periode, ~prix,
  "a", "2023-01-01", 3,
  "b", "2023-01-01", 2,
  "c", "2023-02-01", 2,
  "d", "2023-02-01", 4
)

tab2 <- tribble(
  ~code, ~`2018-01-01`,  ~`2018-02-01`,  ~`2019-01-01`, ~`2019-02-01`, ~`2020-01-01`,  
  ~`2020-02-01`,~`2021-01-01`,  ~`2021-02-01`, ~`2022-01-01`, ~`2022-02-01`,
  "a", 2, 1, 2, 3, 3, 4, 1, 2, 2, 1,
  "b", 1, 2, 4, 2, 1, 2, 1, 5, 1, 2,
  "c", 2, 1, 5, 6, 1, 3, 4, 3, 1, 3,
  "d", 3, 2, 7, 8, 6, 4, 5, 9, 7, 8
)

我想在tab1中添加三列N_1N_2N_3,例如,当表1中的Periode为2023-01-01时:

  • 表2中N_1包含值2022-01-01
  • 表2中的N_2包含值2021-01-01
  • 表2中N_3的值为2020-01-01

以下是一个具有预期结果的最小可重现示例:

# A tibble: 4 × 6
  code  periode     prix   N_1   N_2   N_3
  <chr> <chr>      <dbl> <dbl> <dbl> <dbl>
1 a     2023-01-01     3     2     1     3
2 b     2023-01-01     2     1     1     1
3 c     2023-02-01     2     3     3     3
4 d     2023-02-01     4     8     9     4

在真实的表中,当然有每年的所有月份,这就是为什么找到要添加的正确列很重要.

我试过这样的方法:

result <- tab1 |>
 group_by(periode) |> 
 mutate(N_1 = tab2[[""]]... 

首先要感谢大家!

推荐答案

似乎您要做的是将tab2转换为较长的格式,筛选2020到2022年,将它们重命名为N_1到N_3,然后按月将它们重新转换为宽格式分组.

library(tidyverse)
library(lubridate)
tab2 %>% 
  pivot_longer(-code,names_to = "date") %>%
  mutate(year = year(date),
         month = month(date)) %>%
  filter(year %in% (2020:2022)) %>% 
  select(-date) %>%
  mutate(year = recode(year, `2022` = "N_1", `2021` = "N_2", `2020` = "N_3")) %>%
  pivot_wider(id_cols = c("month","code"),names_from = "year") -> tab2_revised

tab2_revised
## A tibble: 8 × 5
#  month code    N_3   N_2   N_1
#  <dbl> <chr> <dbl> <dbl> <dbl>
#1     1 a         3     1     2
#2     2 a         4     2     1
#3     1 b         1     1     1
#4     2 b         2     5     2
#5     1 c         1     4     1
#6     2 c         3     3     3
#7     1 d         6     5     7
#8     2 d         4     9     8

一旦我们做到了这一点,我们就可以每月加入tab1个.

tab1 %>%
  mutate(month = month(ymd(periode))) %>%
  left_join(tab2_revised, by = c("code","month")) %>%
  select(code,periode,prix,N_1,N_2,N_3)
## A tibble: 4 × 6
#  code  periode     prix   N_1   N_2   N_3
#  <chr> <chr>      <dbl> <dbl> <dbl> <dbl>
#1 a     2023-01-01     3     2     1     3
#2 b     2023-01-01     2     1     1     1
#3 c     2023-02-01     2     3     3     3
#4 d     2023-02-01     4     8     9     4

R相关问答推荐

如何在x轴下方画一条带有箭头的线?

在处理因素时,Base R grep家族比stringr变体快得多

在Julia中调用R函数

使用ggplot 2根据R中的类别排列Likert比例gplot

更改Heatmap Annotation对象的名称

如何按排序顺序打印一个框架中所有精确的唯一值?

在R中替换函数中的特定符号

然后根据不同的列值有条件地执行函数

在R中,如何在每个堆叠的条上放置误差条,特别是当使用facet_grid时?

如何直接从R中的风险分数计算c指数?

当我们有多个特殊字符时,使用gsub删除名称和代码'

绘制采样开始和采样结束之间的事件

方法::slotName如何处理非类、非字符的参数?

如何根据数据帧中的值从该数据帧中提取值?

如何将网站图像添加到带有极坐标的面包裹条形图?

更新R中的数据表(使用data.table)

WRS2包中带有bwtrim的简单ANOVA抛出错误

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

如何预测原始数据集并将值添加到原始数据集中

如何构建一个for循环来循环处理动物ID?