【问题标题】:Separate comma separated values different lines [duplicate]分隔逗号分隔值不同的行[重复]
【发布时间】:2019-05-01 19:44:56
【问题描述】:

我有这样的数据。

structure(list(structureId = c("1JDN", "1DP4", "1XS5", "1SW1", 
"1P99", "1IXH"), structureTitle = c("Crystal Structure of Hormone Receptor", 
"DIMERIZED HORMONE BINDING DOMAIN OF THE ATRIAL NATRIURETIC PEPTIDE RECEPTOR", 
"The Crystal Structure of Lipoprotein Tp32 from Treponema pallidum", 
"Crystal structure of ProX from Archeoglobus fulgidus in complex with proline betaine", 
"1.7A crystal structure of protein PG110 from Staphylococcus aureus", 
"PHOSPHATE-BINDING PROTEIN (PBP) COMPLEXED WITH PHOSPHATE"), 
    chainId = c("A", "A", "A", "A", "A", "A"), ligandId = c("BMA,CL,FUC,MAN,NAG,NDG", 
    "CL,NAG,SO4", "MET", "MSE,PBE,ZN", "GLY,MET", "PO4"), ligandName = c("BETA-D-MANNOSE,CHLORIDE ION,ALPHA-L-FUCOSE,ALPHA-D-MANNOSE,N-ACETYL-D-GLUCOSAMINE,2-(ACETYLAMINO)-2-DEOXY-A-D-GLUCOPYRANOSE", 
    "CHLORIDE ION,N-ACETYL-D-GLUCOSAMINE,SULFATE ION", "METHIONINE", 
    "SELENOMETHIONINE,1,1-DIMETHYL-PROLINIUM,ZINC ION", "GLYCINE,METHIONINE", 
    "PHOSPHATE ION")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

我想将ligandIdligandName 的值分成不同的行。我的意思是,每行只有 1 个 ligandIdligandName

我尝试过使用separate_rows,但它不能很好地处理我的两列。

df %>% separate_rows(ligandId, ligandName, sep = ",")

但我收到此错误:

> df %>% separate_rows(ligandId, ligandName, sep = ",")
Error: All nested columns must have the same number of elements.
Call `rlang::last_error()` to see a backtrace
> rlang::last_error()
<error>
message: All nested columns must have the same number of elements.
class:   `rlang_error`
backtrace:
  1. tidyr::separate_rows(., ligandId, ligandName, sep = ",")
 10. tidyr:::unnest.data.frame(data, !!!syms(vars), .drop = FALSE)
 12. tidyr::separate_rows(., ligandId, ligandName, sep = ",")
Call `rlang::last_trace()` to see the full backtrace

另外,我试过这个:Split comma-separated strings in a column into separate rows,但没有成功。

最后我想要这样的东西:

1JDN   A   BMA   BETA-D-MANNOSE
1JDN   A   CL    CHLORIDE ION
1JDN   A   FUC   ALPHA-L-FUCOSE
1JDN   A   MAN   ALPHA-D-MANNOSE
1JDN   A   NAG   N-ACETYL-D-GLUCOSAMINE
1JDN   A   NDG   2-(ACETYLAMINO)-2-DEOXY-A-D-GLUCOPYRANOSE
...

【问题讨论】:

  • 请检查separategather from tidyverse
  • @Sonny 我试过separated_rows,但没有处理多列。 @camille 抱歉,我看到了这个,但我还是有错误。
  • 如果您在该帖子中尝试了所有 4 个答案,但没有一个有效,您应该使用信息更新您的问题,以说明为什么需要另一种方法
  • 您的数据的str 是什么?那里似乎有列表。
  • 在第 4 行,ligandId 中有 2 个逗号,ligandName 中有 3 个逗号。可能是因为化学符号——在这种情况下,您需要找到一些不同的分隔符来分割行。

标签: r split dplyr row tidyverse


【解决方案1】:

我们可以使用separate_rows

library(tidyverse)
df1 %>% 
    separate_rows(ligandId, sep=",")

由于'ligandId'、'ligandName'每行的字数不一样,一种选择是将gather转成'long'格式,然后在'val'列上做separate_rows,最后spread 回到'wide'

df1 %>% 
  gather(key, val, ligandId, ligandName) %>%
  separate_rows(val, sep=",") %>% 
  group_by(structureId, key) %>% 
  mutate(rn = row_number()) %>% 
  spread(key, val) %>%
  select(-rn)
# A tibble: 17 x 5
# Groups:   structureId [6]
#   structureId structureTitle                                        chainId ligandId ligandName                
#   <chr>       <chr>                                                 <chr>   <chr>    <chr>                     
# 1 1DP4        DIMERIZED HORMONE BINDING DOMAIN OF THE ATRIAL NATRI… A       CL       CHLORIDE ION              
# 2 1DP4        DIMERIZED HORMONE BINDING DOMAIN OF THE ATRIAL NATRI… A       NAG      N-ACETYL-D-GLUCOSAMINE    
# 3 1DP4        DIMERIZED HORMONE BINDING DOMAIN OF THE ATRIAL NATRI… A       SO4      SULFATE ION               
# 4 1IXH        PHOSPHATE-BINDING PROTEIN (PBP) COMPLEXED WITH PHOSP… A       PO4      PHOSPHATE ION             
# 5 1JDN        Crystal Structure of Hormone Receptor                 A       BMA      BETA-D-MANNOSE            
# 6 1JDN        Crystal Structure of Hormone Receptor                 A       CL       CHLORIDE ION              
# 7 1JDN        Crystal Structure of Hormone Receptor                 A       FUC      ALPHA-L-FUCOSE            
# 8 1JDN        Crystal Structure of Hormone Receptor                 A       MAN      ALPHA-D-MANNOSE           
# 9 1JDN        Crystal Structure of Hormone Receptor                 A       NAG      N-ACETYL-D-GLUCOSAMINE    
#10 1JDN        Crystal Structure of Hormone Receptor                 A       NDG      2-(ACETYLAMINO)-2-DEOXY-A…
#11 1P99        1.7A crystal structure of protein PG110 from Staphyl… A       GLY      GLYCINE                   
#12 1P99        1.7A crystal structure of protein PG110 from Staphyl… A       MET      METHIONINE                
#13 1SW1        Crystal structure of ProX from Archeoglobus fulgidus… A       MSE      SELENOMETHIONINE          
#14 1SW1        Crystal structure of ProX from Archeoglobus fulgidus… A       PBE      1                         
#15 1SW1        Crystal structure of ProX from Archeoglobus fulgidus… A       ZN       1-DIMETHYL-PROLINIUM      
#16 1SW1        Crystal structure of ProX from Archeoglobus fulgidus… A       <NA>     ZINC ION                  
#17 1XS5        The Crystal Structure of Lipoprotein Tp32 from Trepo… A       MET      METHIONINE            

对于字数不同的多列,使用cSplit

library(splitstackshape)
na.omit(cSplit(df1, c("ligandId", "ligandName"), sep=",", "long"))

【讨论】:

  • 我试过 df %&gt;% separate_rows(ligandId, ligandName) 但我得到了 Error: All nested columns must have the same number of elements. Call rlang::last_error()` 来查看回溯`
  • @AurelianoGuedes 如果配体Id、配体名称中对应元素的长度不一样,你想如何拆分或填充值
  • 感谢@akrun 解决了
猜你喜欢
  • 2017-07-04
  • 2011-07-26
  • 2013-07-05
  • 2017-06-22
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多