将行除以包含逗号的多列
Divide rows by more than one columns containing commas
我正在尝试分隔存在逗号的数据框的某些行。
这是一个示例片段:
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)
但是我不想只根据一列来划分行,而是考虑到所有有多个值的列(并重复没有逗号的值)。
我怎样才能做到这一点?
您正在寻找的函数是 separate_rows
来自包 tidyr
.
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))
我正在尝试分隔存在逗号的数据框的某些行。
这是一个示例片段:
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)
但是我不想只根据一列来划分行,而是考虑到所有有多个值的列(并重复没有逗号的值)。
我怎样才能做到这一点?
您正在寻找的函数是 separate_rows
来自包 tidyr
.
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))