使用 dplyr 将一张表更新为第二张表

问题描述 投票:0回答:1

我有两个数据框。第一个名为first_df,第二个名为second_df。现在,我想将第二个数据框的数据更新到第一个数据框。

 # First data frame
library(dplyr)
    first_df <- data.frame(
                        ShortName = c("A", "B", "C"),
                        t1 = c(0, 0, 0 ),
                        t2 = c(1, 1, 1),
                        t3 = c(2, 2, 2),
                        t4 = c(3, 3, 3)
                      )

enter image description here

 # Second data frame
    second_df <- data.frame(
                    ShortName = c("A", "B", "C"),
                    Year = c(2024, 2025, 2026 ),
                    Value=c(0, 5, 10)
                  )
    

enter image description here

更新应使t1、t2、t3、t4列分别对应年份2024、2025、2026、2027。如果value参数中的年份是2026,则表示将应用该值从 2026 年开始,包括 2027 年。

最终,表格应如下图所示。

enter image description here

有人可以帮我用 dplyr 做到这一点吗?

r dplyr
1个回答
0
投票

我可能误解了,但这是一个可能的解决方案:

library(dplyr)
library(tidyr)

first_df <- data.frame(
  ShortName = c("A", "B", "C"),
  t1 = c(0, 0, 0 ),
  t2 = c(1, 1, 1),
  t3 = c(2, 2, 2),
  t4 = c(3, 3, 3)
)

second_df <- data.frame(
  ShortName = c("A", "B", "C"),
  Year = c(2024, 2025, 2026 ),
  Value=c(0, 5, 10)
)

first_df %>%
  pivot_longer(-ShortName,
               names_to = "timepoint",
               values_to = "original_value") %>%
  mutate(original_year = 2023 + row_number(), .by = ShortName) %>% 
  left_join(second_df, by = join_by(ShortName)) %>%
  mutate(amended_value = ifelse(original_year < Year, original_value, Value)) %>%
  pivot_wider(id_cols = ShortName,
              names_from = timepoint,
              values_from = amended_value)
#> # A tibble: 3 × 5
#>   ShortName    t1    t2    t3    t4
#>   <chr>     <dbl> <dbl> <dbl> <dbl>
#> 1 A             0     0     0     0
#> 2 B             0     5     5     5
#> 3 C             0     1    10    10

创建于 2024-05-13,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.