【问题标题】:Add two new columns based on another data frame基于另一个数据框添加两个新列
【发布时间】:2022-12-01 03:15:45
【问题描述】:

有这样的数据框:

structure(list(id = c("id1", "id1", "id2", "id2", "id3", "id3"
), title_num = c(1, 2, 1, 2, 1, 2), title_name = c("amazon1", 
"yahoo2", "google1", NA, "yahoo1", "amazon2")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

另一个是这样的:

    dfcheck <- structure(list(status = c("open/close", "close", "open"), stock = c("company energy", 
"goods and books", "other"), name = c("amazon1;google1", "google3;yahoo1", 
"yahoo2;amazon2;google2")), class = "data.frame", row.names = c(NA, 
-3L))

怎么可能有这样的输出:

id title_num title_name   stock           status
id1         1    amazon1 company energy open/close
id1         2     yahoo2 other          open
id2         1    google1 company energy open/close
id2         2       <NA> <NA>           <NA>
id3         1     yahoo1 goods and books close
id3         2    amazon2 other           open

【问题讨论】:

    标签: r


    【解决方案1】:
    library(dplyr)
    
    df <-
    structure(list(id = c("id1", "id1", "id2", "id2", "id3", "id3"
    ), title_num = c(1, 2, 1, 2, 1, 2), title_name = c("amazon1", 
                                                       "yahoo2", "google1", NA, "yahoo1", "amazon2")), row.names = c(NA, 
                                                                                                                     -6L), class = c("tbl_df", "tbl", "data.frame"))
    
    dfcheck <-
     structure(list(status = c("open/close", "close", "open"), stock = c("company energy", 
                                                                                   "goods and books", "other"), name = c("amazon1;google1", "google3;yahoo1", 
                                                                                                                         "yahoo2;amazon2;google2")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                         -3L))
    
    df %>% 
      left_join(
        dfcheck %>% 
          separate_rows(name,sep = ";"),
        by = c("title_name" = "name")
      )
    
    # A tibble: 6 x 5
      id    title_num title_name status     stock          
      <chr>     <dbl> <chr>      <chr>      <chr>          
    1 id1           1 amazon1    open/close company energy 
    2 id1           2 yahoo2     open       other          
    3 id2           1 google1    open/close company energy 
    4 id2           2 NA         NA         NA             
    5 id3           1 yahoo1     close      goods and books
    6 id3           2 amazon2    open       other   
    

    【讨论】:

      【解决方案2】:

      您可以在第二个数据集的 strsplit 列上使用 left_join

      library(dplyr)
      library(tidyr)
      
      left_join(df1, df2 %>% 
        mutate(name = strsplit(name, ";")) %>% 
        unnest(name), c("title_name" = "name"))
      # A tibble: 6 × 5
        id    title_num title_name status     stock
        <chr>     <dbl> <chr>      <chr>      <chr>
      1 id1           1 amazon1    open/close company energy
      2 id1           2 yahoo2     open       other
      3 id2           1 google1    open/close company energy
      4 id2           2 NA         NA         NA
      5 id3           1 yahoo1     close      goods and books
      6 id3           2 amazon2    open       other
      

      数据

      df1 <- structure(list(id = c("id1", "id1", "id2", "id2", "id3", "id3"
      ), title_num = c(1, 2, 1, 2, 1, 2), title_name = c("amazon1",
      "yahoo2", "google1", NA, "yahoo1", "amazon2")), row.names = c(NA,
      -6L), class = c("tbl_df", "tbl", "data.frame"))
      
      df2 <- structure(list(status = c("open/close", "close", "open"), stock = c("company energy",
      "goods and books", "other"), name = c("amazon1;google1", "google3;yahoo1",
      "yahoo2;amazon2;google2")), class = "data.frame", row.names = c(NA,
      -3L))
      

      【讨论】:

        猜你喜欢
        • 2018-01-13
        • 2020-12-20
        • 2021-05-12
        • 2022-07-18
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        相关资源
        最近更新 更多