我正在尝试分隔逗号存在的数据框的一些行。
这是一个示例片段:
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))
您可以对splitstackshape
和zoo
执行此操作:
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))