Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加速R中的循环,以消除数据帧中字符串的一部分_R_String_Performance_For Loop_Dataframe - Fatal编程技术网

加速R中的循环,以消除数据帧中字符串的一部分

加速R中的循环,以消除数据帧中字符串的一部分,r,string,performance,for-loop,dataframe,R,String,Performance,For Loop,Dataframe,我有以下巨大的数据帧: > dim(cons) [1] 14279806 5 > head(cons) Gene.ID Gene.Symbol Transcript.ID miRNA context...score 1 ENSG00000188846.9 RPL14 ENST00000416518.1 hsa-miR-373-3p -0.042 2 ENSG00000188846.9

我有以下巨大的数据帧:

> dim(cons)
[1] 14279806        5
> head(cons)
     Gene.ID        Gene.Symbol     Transcript.ID           miRNA context...score
1 ENSG00000188846.9       RPL14 ENST00000416518.1  hsa-miR-373-3p          -0.042
2 ENSG00000188846.9       RPL14 ENST00000416518.1 hsa-miR-520a-3p          -0.109
3 ENSG00000188846.9       RPL14 ENST00000416518.1    hsa-miR-520b          -0.085
4 ENSG00000188846.9       RPL14 ENST00000416518.1 hsa-miR-520c-3p          -0.085
5 ENSG00000188846.9       RPL14 ENST00000416518.1 hsa-miR-520d-3p          -0.109
我要做的是删除Gene.ID和Transcript.ID列中“.”后面的数字,在这两种情况下,“”前面总是有15个字符。 为此,我使用了以下代码:

for (i in 1:nrow(cons)){
  cons$Transcript.ID[i]<-substr(cons$Transcript.ID[i],1,15)
  cons$Gene.ID[i]<-substr(cons$Gene.ID[i],1,15)
}
for(1中的i:nrow(cons)){

cons$Transcript.ID[i]
substr
已矢量化,您只需执行以下操作:

cons$Transcript.ID<-substr(cons$Transcript.ID,1,15)
cons$Gene.ID<-substr(cons$Gene.ID,1,15)
如果它们不是因素,你可以先转换它们,但从@Benjamen下面的评论来看,你可能不会因为转换时间而获得时间

cons$Transcript.ID <- factor(cons$Transcript.ID) 
cons$Gene.ID       <- factor(cons$Gene.ID)       

cons$Transcript.ID如果要允许不同的字符串长度,还可以使用
sub
仅获取“.”之前的内容:


下面是一百万行的示例。时间以秒为单位

library(dplyr)
df = data.frame(ID1 = paste0("MGH45328914",sample(c(1001:9999),1000000,replace = T),".2"),
                ID2 = paste0("NJK4123914",sample(c(1001:9999),1000000,replace = T),".6"),stringsAsFactors = F)
system.time(df <- df %>% mutate(ID1 = strsplit(ID1, ".",fixed = T)[[1]][1],ID2 = strsplit(ID2, ".",fixed = T)[[1]][1]))

# user  system elapsed 
# 0.22    0.00    0.22 
df = data.frame(ID1 = paste0("MGH45328914",sample(c(1001:9999),10000000,replace = T),".2"),
                ID2 = paste0("NJK4123914",sample(c(1001:9999),10000000,replace = T),".6"),stringsAsFactors = F)
system.time(df <- df %>% mutate(ID1 = strsplit(ID1, ".",fixed = T)[[1]][1],ID2 = strsplit(ID2, ".",fixed = T,)[[1]][1]))

# user  system elapsed 
# 9.42    0.15    9.61 
库(dplyr)
df=数据帧(ID1=粘贴0(“MGH45328914”,样本(c(1001:9999),1000000,替换=T),”.2”),
ID2=paste0(“NJK4123914”,样本(c(1001:9999),1000000,替换=T),“.6”,stringsAsFactors=F)
系统时间(df%突变(ID1=strsplit(ID1,“.”,fixed=T)[[1]][1],ID2=strsplit(ID2,“.”,fixed=T)[[1]]
#用户系统运行时间
# 0.22    0.00    0.22 
下面是1000万行的示例。时间以秒为单位

library(dplyr)
df = data.frame(ID1 = paste0("MGH45328914",sample(c(1001:9999),1000000,replace = T),".2"),
                ID2 = paste0("NJK4123914",sample(c(1001:9999),1000000,replace = T),".6"),stringsAsFactors = F)
system.time(df <- df %>% mutate(ID1 = strsplit(ID1, ".",fixed = T)[[1]][1],ID2 = strsplit(ID2, ".",fixed = T)[[1]][1]))

# user  system elapsed 
# 0.22    0.00    0.22 
df = data.frame(ID1 = paste0("MGH45328914",sample(c(1001:9999),10000000,replace = T),".2"),
                ID2 = paste0("NJK4123914",sample(c(1001:9999),10000000,replace = T),".6"),stringsAsFactors = F)
system.time(df <- df %>% mutate(ID1 = strsplit(ID1, ".",fixed = T)[[1]][1],ID2 = strsplit(ID2, ".",fixed = T,)[[1]][1]))

# user  system elapsed 
# 9.42    0.15    9.61 
df=data.frame(ID1=paste0(“MGH45328914”,样本(c(1001:9999),10000000,replace=T),”.2”),
ID2=paste0(“NJK4123914”,样本(c(1001:9999),10000000,替换=T),“.6”,stringsAsFactors=F)
系统时间(df%变异(ID1=strsplit(ID1,“.”,fixed=T)[[1]][1],ID2=strsplit(ID2,“.”,fixed=T,)[[1]][1]))
#用户系统运行时间
# 9.42    0.15    9.61 

我认为匹配
“\\.[0-9]+$”
可能有点健壮。
“\\..*”
将删除第一个
之后的所有内容(在这种情况下可能可以接受),如果我们能够验证
之后的所有字符,那么匹配将更加健壮。”
是数字。这里可能是这种情况,但是如果在
之后出现字母或其他符号。”
它将失败。在我的系统上,我发现单独使用
substr
比转换为因子然后再转换为
substr
级别要快。但大部分是转换。如果它们已经是因子,那么在级别上工作要快得多。我使用了第一个解决方案,运行时非常好,谢谢!
df = data.frame(ID1 = paste0("MGH45328914",sample(c(1001:9999),10000000,replace = T),".2"),
                ID2 = paste0("NJK4123914",sample(c(1001:9999),10000000,replace = T),".6"),stringsAsFactors = F)
system.time(df <- df %>% mutate(ID1 = strsplit(ID1, ".",fixed = T)[[1]][1],ID2 = strsplit(ID2, ".",fixed = T,)[[1]][1]))

# user  system elapsed 
# 9.42    0.15    9.61