涉及strsplit的R数据处理
R data processing involving strsplit
我有一个如下所示的数据框:
> df
V1 V2 V3 V4 V5 V6 V7
1 chr1:859582-899582 AHR.pfm 33440 - 9.188581 gcacgcaac NA
2 chr2:859582-899582 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA
3 chr1:859582-899582 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA
4 chr13:859582-899582 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA
5 chr21:859582-899582 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA
6 chrX:859582-899582 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA
我想将多个新列附加到此数据框,所有这些列都将包含来自此数据框的信息。详情如下:
- 附加列 chr 具有值 strsplit(df$V1,":")[[1]](拆分
第一列值:并将第一个索引分配给这个新的
列)
- 附加列 start 具有值 strsplit(df$V1,":")[[2]] =>
strsplit(df$V1,"-")[[1]] (首先拆分第一列值:取
第二个索引然后将其拆分 - 并将第一个索引分配给这个新的
列)
- 追加列 end 具有值 df$start + length(df$V6)(添加
start的值,V6列的字符长度)
- 附加列 TF 具有值 strsplit(df$V2,".")[[1]](拆分
上的第二列值。并将第一个索引分配给这个新的
列
因此附加的新列如下所示:
chr1 859582 859591 AHR
chr2 859582 859600 AIRE
chr1 859582 859600 AIRE
chr13 859582 859594 ALX1
chr21 859582 859594 ALX1
chrX 859582 859594 ALX1
1) tidyr/dplyr 这会将列 V1
分成 chr
、start
和 end
列,并且然后在 V2
中的第一个点之前附加一个 TF
列,其中包含所有内容。 mutate
的替代方案可能是 separate(V2, "TF", extra = "drop")
,它将删除 V2
并将 TF
放在它的位置。如果您还想保留原始列,请添加 separate
参数 remove=FALSE
。
library(dplyr)
library(tidyr)
library(dplyr)
library(tidyr)
df %>%
separate(V1, c("chr", "start", "end"), convert = TRUE) %>%
mutate(TF = sub("[.].*", "", V2), end = end + nchar(V6))
给予:
chr start end V2 V3 V4 V5 V6 V7 TF
1 chr1 859582 899591 AHR.pfm 33440 - 9.188581 gcacgcaac NA AHR
2 chr2 859582 899600 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA AIRE
3 chr1 859582 899600 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA AIRE
4 chr13 859582 899594 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA ALX1
5 chr21 859582 899594 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA ALX1
6 chrX 859582 899594 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA ALX1
2) 没有包 一种只使用 base R 的方法是:
nms <- c("chr", "start", "end")
df2 <- cbind(df[-1],
read.table(text = sub("-", ":", df$V1), sep = ":", as.is = TRUE, col.names = nms),
TF = sub("[.].*", "", df$V2),
stringsAsFactors = FALSE)
df2 <- transform(df2, end = end + nchar(V6))
给予:
> df2
V2 V3 V4 V5 V6 V7 chr start end TF
1 AHR.pfm 33440 - 9.188581 gcacgcaac NA chr1 859582 899591 AHR
2 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA chr2 859582 899600 AIRE
3 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA chr1 859582 899600 AIRE
4 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA chr13 859582 899594 ALX1
5 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA chr21 859582 899594 ALX1
6 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA chrX 859582 899594 ALX1
注: df
可重现形式:
Lines <- "
V1 V2 V3 V4 V5 V6 V7
1 chr1:859582-899582 AHR.pfm 33440 - 9.188581 gcacgcaac NA
2 chr2:859582-899582 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA
3 chr1:859582-899582 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA
4 chr13:859582-899582 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA
5 chr21:859582-899582 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA
6 chrX:859582-899582 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA"
df <- read.table(text = Lines, as.is = TRUE)
您可以编写一个函数 fun
来执行此操作,并重复调用 sapply/strsplit
。
fun <- function(DF){
chr <- sapply(strsplit(DF[[1]], ":"), `[`, 1)
start <- sapply(strsplit(DF[[1]], ":"), `[`, 2)
end <- as.integer(sapply(strsplit(start, "-"), `[`, 1)) + nchar(DF[[6]])
start <- sapply(strsplit(start, "-"), `[`, 1)
TF <- sapply(strsplit(DF[[2]], "\."), `[`, 1)
cbind(DF, data.frame(chr, start, end, TF))
}
fun(df)
请注意,必须使用 class character
的 V1
和 V2
列读取数据,而不是 factor
。如果它们属于 class factor
,则首先将它们强制为 character
,或者如果适用,设置参数 stringsAsFactors = FALSE
。
数据。
df <-
structure(list(V1 = c("chr1:859582-899582", "chr2:859582-899582",
"chr1:859582-899582", "chr13:859582-899582", "chr21:859582-899582",
"chrX:859582-899582"), V2 = c("AHR.pfm", "AIRE.pfm", "AIRE.3.pfm",
"ALX1.pfm", "ALX1.1.pfm", "ALX1.2.pfm"), V3 = c(33440L, 7387L,
30639L, 11835L, 16260L, 20686L), V4 = c("-", "+", "-", "+", "+",
"+"), V5 = c(9.188581, 7.982141, 8.127811, 7.48571, 9.529333,
9.241755), V6 = c("gcacgcaac", "TCTGGTTCAGTTGGATGC", "aaaaccaaacaaacaaaa",
"GTAATTGTGTTA", "GTAATTAATTTA", "CTAATTAATTTA"), V7 = c(NA, NA,
NA, NA, NA, NA)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6",
"V7"), class = "data.frame", row.names = c("1", "2", "3", "4",
"5", "6"))
我有一个如下所示的数据框:
> df
V1 V2 V3 V4 V5 V6 V7
1 chr1:859582-899582 AHR.pfm 33440 - 9.188581 gcacgcaac NA
2 chr2:859582-899582 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA
3 chr1:859582-899582 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA
4 chr13:859582-899582 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA
5 chr21:859582-899582 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA
6 chrX:859582-899582 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA
我想将多个新列附加到此数据框,所有这些列都将包含来自此数据框的信息。详情如下:
- 附加列 chr 具有值 strsplit(df$V1,":")[[1]](拆分 第一列值:并将第一个索引分配给这个新的 列)
- 附加列 start 具有值 strsplit(df$V1,":")[[2]] => strsplit(df$V1,"-")[[1]] (首先拆分第一列值:取 第二个索引然后将其拆分 - 并将第一个索引分配给这个新的 列)
- 追加列 end 具有值 df$start + length(df$V6)(添加 start的值,V6列的字符长度)
- 附加列 TF 具有值 strsplit(df$V2,".")[[1]](拆分 上的第二列值。并将第一个索引分配给这个新的 列
因此附加的新列如下所示:
chr1 859582 859591 AHR
chr2 859582 859600 AIRE
chr1 859582 859600 AIRE
chr13 859582 859594 ALX1
chr21 859582 859594 ALX1
chrX 859582 859594 ALX1
1) tidyr/dplyr 这会将列 V1
分成 chr
、start
和 end
列,并且然后在 V2
中的第一个点之前附加一个 TF
列,其中包含所有内容。 mutate
的替代方案可能是 separate(V2, "TF", extra = "drop")
,它将删除 V2
并将 TF
放在它的位置。如果您还想保留原始列,请添加 separate
参数 remove=FALSE
。
library(dplyr)
library(tidyr)
library(dplyr)
library(tidyr)
df %>%
separate(V1, c("chr", "start", "end"), convert = TRUE) %>%
mutate(TF = sub("[.].*", "", V2), end = end + nchar(V6))
给予:
chr start end V2 V3 V4 V5 V6 V7 TF
1 chr1 859582 899591 AHR.pfm 33440 - 9.188581 gcacgcaac NA AHR
2 chr2 859582 899600 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA AIRE
3 chr1 859582 899600 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA AIRE
4 chr13 859582 899594 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA ALX1
5 chr21 859582 899594 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA ALX1
6 chrX 859582 899594 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA ALX1
2) 没有包 一种只使用 base R 的方法是:
nms <- c("chr", "start", "end")
df2 <- cbind(df[-1],
read.table(text = sub("-", ":", df$V1), sep = ":", as.is = TRUE, col.names = nms),
TF = sub("[.].*", "", df$V2),
stringsAsFactors = FALSE)
df2 <- transform(df2, end = end + nchar(V6))
给予:
> df2
V2 V3 V4 V5 V6 V7 chr start end TF
1 AHR.pfm 33440 - 9.188581 gcacgcaac NA chr1 859582 899591 AHR
2 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA chr2 859582 899600 AIRE
3 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA chr1 859582 899600 AIRE
4 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA chr13 859582 899594 ALX1
5 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA chr21 859582 899594 ALX1
6 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA chrX 859582 899594 ALX1
注: df
可重现形式:
Lines <- "
V1 V2 V3 V4 V5 V6 V7
1 chr1:859582-899582 AHR.pfm 33440 - 9.188581 gcacgcaac NA
2 chr2:859582-899582 AIRE.pfm 7387 + 7.982141 TCTGGTTCAGTTGGATGC NA
3 chr1:859582-899582 AIRE.3.pfm 30639 - 8.127811 aaaaccaaacaaacaaaa NA
4 chr13:859582-899582 ALX1.pfm 11835 + 7.485710 GTAATTGTGTTA NA
5 chr21:859582-899582 ALX1.1.pfm 16260 + 9.529333 GTAATTAATTTA NA
6 chrX:859582-899582 ALX1.2.pfm 20686 + 9.241755 CTAATTAATTTA NA"
df <- read.table(text = Lines, as.is = TRUE)
您可以编写一个函数 fun
来执行此操作,并重复调用 sapply/strsplit
。
fun <- function(DF){
chr <- sapply(strsplit(DF[[1]], ":"), `[`, 1)
start <- sapply(strsplit(DF[[1]], ":"), `[`, 2)
end <- as.integer(sapply(strsplit(start, "-"), `[`, 1)) + nchar(DF[[6]])
start <- sapply(strsplit(start, "-"), `[`, 1)
TF <- sapply(strsplit(DF[[2]], "\."), `[`, 1)
cbind(DF, data.frame(chr, start, end, TF))
}
fun(df)
请注意,必须使用 class character
的 V1
和 V2
列读取数据,而不是 factor
。如果它们属于 class factor
,则首先将它们强制为 character
,或者如果适用,设置参数 stringsAsFactors = FALSE
。
数据。
df <-
structure(list(V1 = c("chr1:859582-899582", "chr2:859582-899582",
"chr1:859582-899582", "chr13:859582-899582", "chr21:859582-899582",
"chrX:859582-899582"), V2 = c("AHR.pfm", "AIRE.pfm", "AIRE.3.pfm",
"ALX1.pfm", "ALX1.1.pfm", "ALX1.2.pfm"), V3 = c(33440L, 7387L,
30639L, 11835L, 16260L, 20686L), V4 = c("-", "+", "-", "+", "+",
"+"), V5 = c(9.188581, 7.982141, 8.127811, 7.48571, 9.529333,
9.241755), V6 = c("gcacgcaac", "TCTGGTTCAGTTGGATGC", "aaaaccaaacaaacaaaa",
"GTAATTGTGTTA", "GTAATTAATTTA", "CTAATTAATTTA"), V7 = c(NA, NA,
NA, NA, NA, NA)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6",
"V7"), class = "data.frame", row.names = c("1", "2", "3", "4",
"5", "6"))