如果使用 R

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

在前面的问题之后,在这里输入链接描述我的数据有额外的信息,我在数据中包含了基因。由于相同的基因被预测为不同的酶,结果合并为“+”号,但现在我想按照下面给出的结果拆分结果 我的数据框如下所示

df <-data.frame(Gene= c("A", "B", "C","D","E","F"),
                 G1=c("GH13_22+CBM4",  "GH109+PL7+GH9","GT57", "AA3","",""),
                 G2=c("GH13_22","","GT57+GH15","AA3", "GT41","PL+PL2"),
                 G3=c("GH13", "GH1O9","", "CBM34+GH13+CBM48", "GT41","GH16+CBM4+CBM54+CBM32"))

如果像这样的话就在这里输出

df2<-data.frame(Gene= c("A","A","B", "B","B","C","C","D","D","D","E","F","F","F","F"),
                G1=c("GH13_22","CBM4","GH109","PL7","GH9","GT57","GT57","AA3","AA3","AA3","","","","",""),
                G2=c("GH13_22","GH13_22","","","","GT57","GH15","AA3","AA3","AA3", "GT41","PL","PL2","",""),
            G3=c("GH13","","GH1O9","GH1O9", "GH1O9","","","CBM34","GH13","CBM48", "GT41","GH16","CBM4","CBM54","CBM32"))

请帮忙

r for-loop while-loop tidyr plyr
1个回答
1
投票

这比我想象的要难,但这里有一个方法:

library(stringr)
library(dplyr)
library(tidyr)

df[-1] <- lapply(df[-1], \(x) asplit(str_split_fixed(x, "\\+", 4), 1))
unnest_longer(df, col = G1:G3) %>% 
  mutate(across(G1:G3, ~ na_if(.x, ""))) %>% 
  filter(if_any(G1:G3, complete.cases)) %>% 
  group_by(Gene) %>% 
  fill(G1:G3)

   Gene      G1      G2    G3
1     A GH13_22 GH13_22  GH13
2     A    CBM4 GH13_22  GH13
3     B   GH109    <NA> GH1O9
4     B     PL7    <NA> GH1O9
5     B     GH9    <NA> GH1O9
6     C    GT57    GT57  <NA>
7     C    GT57    GH15  <NA>
8     D     AA3     AA3 CBM34
9     D     AA3     AA3  GH13
10    D     AA3     AA3 CBM48
11    E    <NA>    GT41  GT41
12    F    <NA>      PL  GH16
13    F    <NA>     PL2  CBM4
14    F    <NA>     PL2 CBM54
15    F    <NA>     PL2 CBM32
© www.soinside.com 2019 - 2024. All rights reserved.