簡體   English   中英

兩個數據幀的連接信息 R

[英]join information of two dataframes R

我想在這里加入兩個數據幀 R 第一個

   resno resid elety eleno
    1     ILE     C     3
    1     ILE     O     4
    2     VAL     C    11
    2     VAL     O    12
    3     GLY     C    18
    3     GLY     O    19

第二個

   C.O     dist
  12-18   3.112819
  27-37   2.982788
  51-63   3.185184
  52-62   2.771583
  63-69   3.157737
  70-80   2.956738

所以讓我們解釋一下我需要什么。 查看第二個 dataframe,我在點 12-18 之間有距離(“dist”),對應於第一個 dataframe 中的“eleno”。對於這 2 個點,我也有“resno”,這是我感興趣的,因為我想得到這樣的東西

       resno resid elety eleno rescoup   dist
        1     ILE     C     3     -       -
        1     ILE     O     4     -       -
        2     VAL     C    11     -       -
        2     VAL     O    12    2-3   3.112819
        3     GLY     C    18    2-3   3.112819
        3     GLY     O    19     -       -

我能怎么做? R 這可能嗎?

謝謝!

您可以先從df2創建一個 long dataframe,其中C.O中的每個數字都是唯一的行。

library(dplyr)
library(tidyr)

df3 <- df2 %>%
  separate(C.O, c('col1', 'col2'), sep = '-', convert = TRUE) %>%
  mutate(eleno = purrr::map2(col1, col2, seq), .before = 1, 
         row = row_number()) %>%
  select(-col1, -col2) %>%
  unnest(eleno)

df3
# A tibble: 60 x 3
#   eleno   row  dist
#   <int> <int> <dbl>
# 1    12     1  3.11
# 2    13     1  3.11
# 3    14     1  3.11
# 4    15     1  3.11
# 5    16     1  3.11
# 6    17     1  3.11
# 7    18     1  3.11
# 8    27     2  2.98
# 9    28     2  2.98
#10    29     2  2.98
# … with 50 more rows

使用df1加入此 dataframe 並paste resno值以創建rescoup

df1 %>%
  left_join(df3, by = 'eleno') %>%
  group_by(row) %>%
  mutate(rescoup = paste(resno, collapse = '-'), 
         rescoup = replace(rescoup, is.na(dist), NA)) %>%
  ungroup() %>%
  select(-row)

#  resno resid elety eleno  dist rescoup
#  <int> <chr> <chr> <int> <dbl> <chr>  
#1     1 ILE   C         3 NA    NA     
#2     1 ILE   O         4 NA    NA     
#3     2 VAL   C        11 NA    NA     
#4     2 VAL   O        12  3.11 2-3    
#5     3 GLY   C        18  3.11 2-3    
#6     3 GLY   O        19 NA    NA     

使用data.table ,拆分然后合並:

library(data.table)

merge(d1,
      d2[, lapply(.SD, function(x) unlist(tstrsplit(x, "-", fixed = TRUE,
                                                    type.convert = TRUE)))],
      by.x = "eleno", by.y = "C.O", all.x = TRUE)

#    eleno resno resid elety     dist
# 1:     3     1   ILE     C       NA
# 2:     4     1   ILE     O       NA
# 3:    11     2   VAL     C       NA
# 4:    12     2   VAL     O 3.112819
# 5:    18     3   GLY     C 3.112819
# 6:    19     3   GLY     O       NA
示例數據:
 d1 <- fread("resno resid elety eleno 1 ILE C 3 1 ILE O 4 2 VAL C 11 2 VAL O 12 3 GLY C 18 3 GLY O 19") d2 <- fread("CO dist 12-18 3.112819 27-37 2.982788 51-63 3.185184 52-62 2.771583 63-69 3.157737 70-80 2.956738")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM