【问题标题】:Adding columns and insert info from a second dataframe R从第二个数据框 R 添加列和插入信息
【发布时间】:2020-11-01 14:17:20
【问题描述】:

大家好,我有两个数据框,我想以特定方式将信息从一个 df 连接到另一个数据框。我会解释得更好。这是我的第一个 df,我想在其中添加 6 列(名为 col1、col2 等的通用 col..):

           res1 res4 aa1234 
1 AAAAAA    1    4   IVGG       
2 AAAAAA    8   11   RPRQ        
3 AAAAAA   10   13   RQFP        
4 AAAAAA   12   15   FPFL  
5 AAAAAA   20   23   NQGR      
6 AAAAAA   32   35   HARF    

这是第二个df:

   res1     dist
    1     3.711846
    1     3.698985
    2     4.180874
    2     3.112819
    3     3.559737
    3     3.722107
    4     3.842375
    4     3.914970
    5     3.361647
    5     2.982788
    6     3.245118
    6     3.224230
    7     3.538315
    7     3.602273
    8     3.185184
    8     2.771583
    9     4.276871
    9     3.157737
    10    3.933783
    10    2.956738


     

考虑到“res1”,我想在我的新 6 列中的第一个 df 中添加对应于 res1 = 1 的第二个 df 的“dist”中包含的前 6 个值。 之后,在第一个 df 中我有 res1 = 8,所以我想在新的 6 列中添加来自 res1 = 8 的 6 个值包含在第二个 df 的“dist”中。

我想要这样的东西

res1 res4   aa1234  col1 col2 col3 col4 col5 col6
      1    4   IVGG    3.71 3.79 4.18 3.11 3.55 3.72
      8   11   RPRQ    3.18 2.77 4.27 3.15 3.93 2.95
     10   13   RQFP    
     12   15   FPFL        
     20   23   NQGR   
     32   35   HARF        

请考虑我必须在大型数据集和 1000 多个文件上执行此操作...谢谢!

【问题讨论】:

    标签: r dataframe join


    【解决方案1】:

    您可以创建一个从res1res4 的序列,然后将数据与pdb 连接起来。

    library(tidyverse)
    
    turn %>%
      mutate(res = map2(res1, res4, seq)) %>%
      unnest(res) %>%
      left_join(pdb, by = c('res' = 'res1')) %>%
      group_by(res1 = as.character(res1)) %>%
      mutate(col = paste0('col', row_number())) %>%
      select(-res4, -res, -eleno) %>%
      pivot_wider(names_from = col, values_from = dist)
    

    【讨论】:

    • 我只报告了我感兴趣的列,我也有带有字符的列。事实上我得到了这个错误:由于类型不兼容,无法加入x$res1 x y$res1。 i x$res1> 类型。 i y$res1> 类型。
    • 然后只选择您感兴趣的列,与您显示的示例相同,这样您就不会收到错误消息。 df2 <- df2 %>% select(res1, res4)df1 <- df1 %>% select(res1, dist).
    • 我不能,因为我需要带有字符的列,我的错误是发布问题,抱歉。在 res1 和 res4 之后,我还有其他无法删除的 char 类型的列,但我必须添加问题中发布的 6 列
    • @Nancy 你能试试更新的答案吗?我把res1df2 变成了字符,所以类型匹配。
    • @Nancy 您能否使用dput 添加您的数据或数据样本,以便我检查答案。
    【解决方案2】:

    我们可以从data.table使用rowid

    library(dplyr)
    library(tidyr)
    library(data.table)
    library(stringr)
    df2 %>%
        mutate(col = str_c("col", rowid(res1))) %>%
        pivot_wider(names_from = col, values_from = dist) %>%
        right_join(df1, by = 'res1')
    

    -输出

    # A tibble: 6 x 4
    #   res1  col1  col2  res4
    #  <int> <dbl> <dbl> <int>
    #1     1  3.71  3.70     4
    #2     8  3.19  2.77    11
    #3    10  3.93  2.96    13
    #4    12 NA    NA       15
    #5    20 NA    NA       23
    #6    32 NA    NA       35
    

    数据

    df1 <- structure(list(res1 = c(1L, 8L, 10L, 12L, 20L, 32L), res4 = c(4L, 
    11L, 13L, 15L, 23L, 35L)), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    
    df2 <- structure(list(res1 = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 
    6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), dist = c(3.711846, 
    3.698985, 4.180874, 3.112819, 3.559737, 3.722107, 3.842375, 3.91497, 
    3.361647, 2.982788, 3.245118, 3.22423, 3.538315, 3.602273, 3.185184, 
    2.771583, 4.276871, 3.157737, 3.933783, 2.956738)), class = "data.frame",
    row.names = c(NA, 
    -20L))
    

    【讨论】:

    • 我得到了与上一个答案相同的错误,请阅读 cmets
    • @Nancy 谢谢。您能否使用示例中的dput 更新您的帖子,以便我在测试时了解您的数据结构
    • @Nancy 我用我得到的输出和使用的数据更新了帖子
    猜你喜欢
    • 2021-05-01
    • 2021-06-06
    • 2022-01-09
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多