R 数据帧操作
假设我有一个像这样的数据框R 数据帧操作,r,dataframe,data.table,R,Dataframe,Data.table,假设我有一个像这样的数据框 # start end motif # 2 6 a # 10 15 b # 30 35 c 我如何创建一个数据框来填充剩余的开始和结束位置,比如某个数字Max\u end: Max_end <- 33 # start end motif # 0 2 na # <- 0-2 are filled in because i
# start end motif
# 2 6 a
# 10 15 b
# 30 35 c
我如何创建一个数据框来填充剩余的开始和结束位置,比如某个数字Max\u end
:
Max_end <- 33
# start end motif
# 0 2 na # <- 0-2 are filled in because it is not in the original data frame
# 2 6 a # <- 2-6 are in the original
# 6 10 na # <- 6-10 is not
# 10 15 b # <- 10-15 is
# 15 30 na # and so on
# 30 33 c
目前我就是这样做的:效率很低
library(data.table)
library(stringi)
f <- fread('ABC.txt',header=F,skip=1)$V1
f <- paste(f, collapse = "")
motifs = c('GATC', 'CTGCAG', 'ACCACC', 'CC(A|T)GG', 'CCAC.{8}TGA(C|T)')
v <- na.omit(data.frame(do.call(rbind, lapply(stri_locate_all_regex(f, motifs), unlist))))
v <- v[order(v[,1]),]
v2difference <- "blah"
for(i in 2:nrow(v)){
if(v[i,1] > v[i-1,2]+2){v2difference[i] <- v[i,1]-v[i-1,2]-2}
}
v2difference[1] <- v[1,1]
v2 <- data.frame(Order=seq(1, 2*nrow(v), 2),Lengths=matrix(v2difference, ncol = 1),Motifs="na")
v1 <- data.frame(Order=seq(2, 2*nrow(v), 2),Lengths=(v$end-v$start+1),Motifs=na.omit(unlist(stri_extract_all_regex(f,motifs))))
V <- data.frame(Track=1,rbind(v1,v2))
V <- V[order(V$Order),]
B <- V[,!(names(V) %in% "Order")]
库(data.table)
图书馆(stringi)
fMax\u endMax\u endMax\u endMax\u end后一个问题可以通过dplyr
软件包中的mutate()
轻松回答-只需查找教程即可。至于第一个问题,我不太清楚你在问什么。而且,我相信在这里,双管齐下的问题是不受欢迎的。。。我想这只是一根头发太宽了。您应该编辑该问题,将重点放在算法的效率上,而不是另一种方法。使用dplyr
软件包中的mutate()
可以轻松回答后一个问题-只需查找教程即可。至于第一个问题,我不太清楚你在问什么。而且,我相信在这里,双管齐下的问题是不受欢迎的。。。我想这只是一根头发太宽了。您应该编辑该问题,将重点放在算法的效率上,而不是另一种方法。使用dplyr
软件包中的mutate()
可以轻松回答后一个问题-只需查找教程即可。至于第一个问题,我不太清楚你在问什么。而且,我相信在这里,双管齐下的问题是不受欢迎的。。。我想这只是一根头发太宽了。您应该编辑该问题,将重点放在算法的效率上,而不是另一种方法。使用dplyr
软件包中的mutate()
可以轻松回答后一个问题-只需查找教程即可。至于第一个问题,我不太清楚你在问什么。而且,我相信在这里,双管齐下的问题是不受欢迎的。。。我想这只是一根头发太宽了。你应该编辑这个问题,把重点放在算法的效率上,而不是用另一种方法。我试着把我的帖子分成两个步骤,以便更好地解释我的过程。然而,我认为这只回答了第一部分。我在简化计算起始列和结束列@nongkrongNevermind之间长度的部分时遇到了很多麻烦,我没有看到关于使用mutate()的评论。谢谢你的帮助@换言之,你也可以尝试一下diff(t(yoursresult[1:2])
,yoursresult
是合并后的数据。我是否只需要更改中断?我试图将我的帖子分为两个步骤,以便更好地解释我的过程。然而,我认为这只回答了第一部分。我在简化计算起始列和结束列@nongkrongNevermind之间长度的部分时遇到了很多麻烦,我没有看到关于使用mutate()的评论。谢谢你的帮助@换言之,你也可以尝试一下diff(t(yoursresult[1:2])
,yoursresult
是合并后的数据。我是否只需要更改中断?我试图将我的帖子分为两个步骤,以便更好地解释我的过程。然而,我认为这只回答了第一部分。我在简化计算起始列和结束列@nongkrongNevermind之间长度的部分时遇到了很多麻烦,我没有看到关于使用mutate()的评论。谢谢你的帮助@换言之,你也可以尝试一下diff(t(yoursresult[1:2])
,yoursresult
是合并后的数据。我是否只需要更改中断?我试图将我的帖子分为两个步骤,以便更好地解释我的过程。然而,我认为这只回答了第一部分。我在简化计算起始列和结束列@nongkrongNevermind之间长度的部分时遇到了很多麻烦,我没有看到关于使用mutate()的评论。谢谢你的帮助@换言之,你也可以尝试一下diff(t(yoursresult[1:2])
,yoursresult
是合并后的数据。我是否只需要更改中断
library(data.table)
library(stringi)
f <- fread('ABC.txt',header=F,skip=1)$V1
f <- paste(f, collapse = "")
motifs = c('GATC', 'CTGCAG', 'ACCACC', 'CC(A|T)GG', 'CCAC.{8}TGA(C|T)')
v <- na.omit(data.frame(do.call(rbind, lapply(stri_locate_all_regex(f, motifs), unlist))))
v <- v[order(v[,1]),]
v2difference <- "blah"
for(i in 2:nrow(v)){
if(v[i,1] > v[i-1,2]+2){v2difference[i] <- v[i,1]-v[i-1,2]-2}
}
v2difference[1] <- v[1,1]
v2 <- data.frame(Order=seq(1, 2*nrow(v), 2),Lengths=matrix(v2difference, ncol = 1),Motifs="na")
v1 <- data.frame(Order=seq(2, 2*nrow(v), 2),Lengths=(v$end-v$start+1),Motifs=na.omit(unlist(stri_extract_all_regex(f,motifs))))
V <- data.frame(Track=1,rbind(v1,v2))
V <- V[order(V$Order),]
B <- V[,!(names(V) %in% "Order")]
Max_end <- 33
breaks <- c(0, t(as.matrix(dat[,1:2])), Max_end) # get endpoints
breaks <- breaks[breaks <= Max_end]
merge(dat, data.frame(start=breaks[-length(breaks)], end=breaks[-1]), all=T)
# start end motif
# 1 0 2 <NA>
# 2 2 6 a
# 3 6 10 <NA>
# 4 10 15 b
# 5 15 30 <NA>
# 6 30 33 <NA>
# 7 30 35 c
Max_end <- 33
Max_start <- 10
breaks <- unique(c(Max_start, t(as.matrix(dat[,1:2])), Max_end))
breaks <- breaks[breaks <= Max_end & breaks >= Max_start]
merge(dat, data.frame(start=breaks[-length(breaks)], end=breaks[-1]), all.y=T)
# start end motif
# 1 10 15 b
# 2 15 30 <NA>
# 3 30 33 <NA>