涉及strsplit的R数据处理
我有一个数据框,看起来像这样:涉及strsplit的R数据处理,r,dataframe,strsplit,R,Dataframe,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
> 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
我想将多个新列附加到此数据框,所有这些列都将包含来自此数据框的信息。详情如下:
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
列,然后在TF
列中附加V2
中第一个点之前的所有内容。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
> 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
2)无软件包仅使用基本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))
注: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)
行1)tidyr/dplyr这将列V1
分为chr
、start
和end
列,然后在TF
列中附加V2
中第一个点之前的所有内容。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
> 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
2)无软件包仅使用基本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))
注: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)
Lines您可以编写一个函数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)
您可以编写一个函数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)
@g-grothendieck非常感谢您提供的多种解决方案。这个解决方案只有一个问题,那就是end
列<代码>结束
列应包含值,该值为df$V6中的开始+字符长度
。例如,对于第一行,它将是859582+9=859591
而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次谢谢你。已经添加了。@g-Grothedick您能帮我用foreach循环或parSapply替换for循环吗。谢谢。@g-grothendieck非常感谢您提供的多种解决方案。这个解决方案只有一个问题,那就是end
列<代码>结束
列应包含值,该值为df$V6中的开始+字符长度
。例如,对于第一行,它将是859582+9=859591
而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次谢谢你。已经添加了。@g-Grothedick您能帮我用foreach循环或parSapply替换for循环吗。谢谢。@rui barrada非常感谢您的解决方案。这个解决方案只有一个问题,那就是end
列<代码>结束列应包含值,该值为df$V6中的开始+字符长度
。例如,对于第一行,它将是859582+9=859591
而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次感谢。end@Newbie刚刚修改过。看看是否是这样。对于结束列,您必须选择第一个索引(即开始列),然后在其中添加nchar。它将是:end@rui barradad非常感谢您的解决方案。这个解决方案只有一个问题,那就是end
列<代码>结束
列应包含值,该值为df$V6中的开始+字符长度
。例如,对于第一行,它将是859582+9=859591
而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次感谢。end@Newbie刚刚修改过。看看是否是这样。对于结束列,您必须选择第一个索引(即开始列),然后在其中添加nchar。它将是:end