r语言 - 用多个包含逗号的列分隔行

  • 本文关键字:隔行 包含逗 r语言 r dplyr
  • 更新时间 :
  • 英文 :


我正在尝试分隔逗号存在的数据框的一些行。

这是一个示例片段:

name  ref   alt    exon   impact score
ID1    A    C,T    1,2     l,h     5
ID2    T    A       6      h       8
ID3    T    G,C,A  2,5,7   l,l,h   10,2,3
ID4    C    G       3      m       2

我如何执行以下转换?

name   ref   alt   exon   impact  score
ID1    A     C      1       l      5
ID1    A     T      2       h      5
ID2    T     A      6       h      8
ID3    T     G      2       l      10
ID3    T     C      5       l      2
ID3    T     A      7       h      3
ID4    C     G      3       m      2

我正在尝试做某事

df %>% 
mutate(alt=strsplit(alt, ",")) %>% 
unnest(alt)

但是,我不希望仅仅根据一列来划分行,而是考虑到有多个值的所有列(并且在不存在逗号的情况下重复这些值)。

我怎么才能做到呢?

您要查找的函数是tidyr包中的separate_rows

library(tidyr)
separate_rows(df, everything(), sep = ",")
# A tibble: 7 × 6
name  ref   alt   exon  impact score
<chr> <chr> <chr> <chr> <chr>  <chr>
1 ID1   A     C     1     l      5    
2 ID1   A     T     2     h      5    
3 ID2   T     A     6     h      8    
4 ID3   T     G     2     l      10   
5 ID3   T     C     5     l      2    
6 ID3   T     A     7     h      3    
7 ID4   C     G     3     m      2    

数据
df <- structure(list(name = c("ID1", "ID2", "ID3", "ID4"), ref = c("A", 
"T", "T", "C"), alt = c("C,T", "A", "G,C,A", "G"), exon = c("1,2", 
"6", "2,5,7", "3"), impact = c("l,h", "h", "l,l,h", "m"), score = c("5", 
"8", "10,2,3", "2")), class = "data.frame", row.names = c(NA, 
-4L))

您可以对splitstackshapezoo执行此操作:

library(splitstackshape)
library(zoo)
df <- cSplit(df, 1:ncol(df), "long", sep = ",", type.convert = F)
na.locf(df[rowSums(is.na(df)) != ncol(df),])

name ref alt exon impact score
1:  ID1   A   C    1      l     5
2:  ID1   A   T    2      h     5
3:  ID2   T   A    6      h     8
4:  ID3   T   G    2      l    10
5:  ID3   T   C    5      l     2
6:  ID3   T   A    7      h     3
7:  ID4   C   G    3      m     2

df <- structure(list(name = c("ID1", "ID2", "ID3", "ID4"), ref = c("A", 
"T", "T", "C"), alt = c("C,T", "A", "G,C,A", "G"), exon = c("1,2", 
"6", "2,5,7", "3"), impact = c("l,h", "h", "l,l,h", "m"), score = c("5", 
"8", "10,2,3", "2")), class = "data.frame", row.names = c(NA, 
-4L))

最新更新