代码之家  ›  专栏  ›  技术社区  ›  remo

R: 将值从一个数据帧中的一列复制到组的另一数据帧中选定的几列

  •  0
  • remo  · 技术社区  · 4 年前

    我想将值从一个数据帧复制到另一个数据框架。对我来说,困难在于我在两个数据帧中都有四个组,在我想复制值的数据帧中,我有几个列要插入值。更具体地说,我想从中复制值的数据帧(df1)如下所示:

    structure(list(Name = c("A", "B", "C", "D"), Value = c(2L, 5L, 
    3L, 2L)), class = "data.frame", row.names = c(NA, -4L))
    

    我要插入值的数据帧(df2)如下所示:

    structure(list(Name = c("A", "B", "C", "D"), `Rating 2017-06` = c(NA, 
    NA, NA, NA), `Rating 2017-07` = c(NA, NA, NA, NA), `Ratin g 2017-08` = c(NA, 
    NA, NA, NA), `Rating 2017-09` = c(NA, NA, NA, NA), `Rating 2017-10` = c(NA, 
    NA, NA, NA), `Rating 2017-11` = c(NA, NA, NA, NA), `Rating 2017-12` = c(NA, 
    NA, NA, NA), `Rating 2018-01` = c(4L, 4L, 3L, 3L), `Rating 2018-02` = c(3L, 
    4L, 3L, 2L)), class = "data.frame", row.names = c(NA, -4L))
    

    我想将df1中“值”列的数据复制到df2中的第2至8列(“评分2017-06”到“评分2017-12”)中的每个名称。

    到目前为止,我已经尝试过:

    Merged_Data <- df1 %>% 
      left_join(df1, df2, by="Name")
    
    

    这个代码的问题是,我不能像上面在df2中提到的那样,专门将值从df1复制到选定的列。我不知道我必须在代码中纠正什么才能做到这一点。

    有人能帮我吗? 已经谢谢你了。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Carl    4 年前

    尝试这种方法:

    library(tidyverse)
    
    df1 <- structure(list(
      Name = c("A", "B", "C", "D"),
      Value = c(2L, 5L,
                3L, 2L)
    ),
    class = "data.frame",
    row.names = c(NA,-4L))
    
    df2 <- structure(
      list(
        Name = c("A", "B", "C", "D"),
        `Rating 2016-06` = c(NA,
                             NA, NA, NA),
        `Rating 2017-07` = c(NA, NA, NA, NA),
        `Ratin g 2017-08` = c(NA,
                              NA, NA, NA),
        `Rating 2017-09` = c(NA, NA, NA, NA),
        `Rating 2017-10` = c(NA,
                             NA, NA, NA),
        `Rating 2017-11` = c(NA, NA, NA, NA),
        `Rating 2017-12` = c(NA,
                             NA, NA, NA),
        `Rating 2018-01` = c(4L, 4L, 3L, 3L),
        `Rating 2018-02` = c(3L,
                             4L, 3L, 2L)), class = "data.frame", row.names = c(NA, -4L))
    
    df2 |> 
      left_join(df1) |> 
      mutate(across(contains("2016") | contains("2017"), ~ Value)) |> 
      select(- Value)
    #> Joining, by = "Name"
    #>   Name Rating 2016-06 Rating 2017-07 Ratin g 2017-08 Rating 2017-09
    #> 1    A              2              2               2              2
    #> 2    B              5              5               5              5
    #> 3    C              3              3               3              3
    #> 4    D              2              2               2              2
    #>   Rating 2017-10 Rating 2017-11 Rating 2017-12 Rating 2018-01 Rating 2018-02
    #> 1              2              2              2              4              3
    #> 2              5              5              5              4              4
    #> 3              3              3              3              3              3
    #> 4              2              2              2              3              2
    
    df2 |> 
      left_join(df1) |> 
      mutate(across(`Rating 2016-06`:`Rating 2017-12`, ~ Value)) |> 
      select(- Value)
    #> Joining, by = "Name"
    #>   Name Rating 2016-06 Rating 2017-07 Ratin g 2017-08 Rating 2017-09
    #> 1    A              2              2               2              2
    #> 2    B              5              5               5              5
    #> 3    C              3              3               3              3
    #> 4    D              2              2               2              2
    #>   Rating 2017-10 Rating 2017-11 Rating 2017-12 Rating 2018-01 Rating 2018-02
    #> 1              2              2              2              4              3
    #> 2              5              5              5              4              4
    #> 3              3              3              3              3              3
    #> 4              2              2              2              3              2
    

    创建于2022-04-30由 reprex package (v2.0.1)

    推荐文章