全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
2832 8
2018-05-16
数据格式是这样的:
E00548:177:HKH53CCXY:4:2101:31629:73229 ATGCGTACCACA    TACCAGCAGTTC    163     chr21   5013083 0       138M    =       5013132 187     
E00548:177:HKH53CCXY:4:2214:23957:16516 TACCAGCAGTTC    ATGCGTACCACA    99      chr21   5013083 0       138M    =       5013132 187   
E00548:177:HKH53CCXY:4:2105:27702:23073 AGAGTTCACGGA    TCACCGGTGATA    163     chr21   5021181 0       138M    =       5021195 152     
E00548:177:HKH53CCXY:4:2113:1428:65810  TCACCGGTGATA    AGAGTTCACGGA    99      chr21   5021181 0       138M    =       5021195 152     
E00548:177:HKH53CCXY:4:1223:12246:18239 GACAGGTCATAC    CTCTCCTATAGC    163     chr21   5055301 0       138M    =       5055323 160     
E00548:177:HKH53CCXY:4:1223:12246:18239 GACAGGTCATAC    CTCTCCTATAGC    163     chr21   5055301 0       138M    =       5055323 160     
E00548:177:HKH53CCXY:4:2221:20872:34307 CTCTCCTATAGC    GACAGGTCATAC    99      chr21   5055301 0       138M    =       5055323 160     
E00548:177:HKH53CCXY:4:2221:21836:35203 CTCTCCTATAGC    GACAGGTCATAC    99      chr21   5055301 0       138M    =       5055323 160     
E00548:177:HKH53CCXY:4:1102:10094:23970 CAAGCAACCGAT    TGATACCGGACA    163     chr21   5063635 53      138M    =       5063652 155     
E00548:177:HKH53CCXY:4:1120:5081:43062  TGATACCGGACA    CAAGCAACCGAT    99      chr21   5063635 53      138M    =       5063652 155     


一共10行,想过滤一下,每两行的第四列必须是163和99这两个数字,否则就过滤掉,我写的脚本如下:
data<-read.table("duplex.txt",header=F,fill=TRUE)
res=data.frame()
m=c(163,99)
col=nrow(data)
i=1
while(i<col){
if((data[i,4] %in% m) & (data[i+1,4] %in% m) & (data[i,4]!=data[i+1,4])){
        res=rbind(res,data[i:(i+1),])
        i=i+2
}else{
        i=i+2
}
}
就这10行很快就跑出来了,也满足条件,但是我跑原始数据的时候,跑了很久很久,原数据也才72M,33万多行,为什么会跑这么慢?是我陷入死循环了?还是这个脚本本身就有问题?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2018-5-16 18:39:53
在R 中,做这种循环,少数据,一般没问题,数据一大,就必会很慢。。
用tidyverse 中相关函数,该 是很容易的。。
一,标列变量名X1,X2,X3,X4....
二,加一列 No=1L:NROW(data)
三,由 No 计算一个新变量:Gno=as.integer(ceiling(No/2))   
   ## 如此,每二行 Gno 是相同的,是一个组   根据你对 i 赋值 ,该 是这样。。
四,后面,就很简单了,无须再写了吧。。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-5-16 18:42:14
jgchen1966 发表于 2018-5-16 18:39
在R 中,做这种循环,少数据,一般没问题,数据一大,就必会很慢。。
用tidyverse 中相关函数,该 是很容 ...
这个算法,在几百万行数据,也就几秒。。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-5-16 19:14:43
jgchen1966 发表于 2018-5-16 18:39
在R 中,做这种循环,少数据,一般没问题,数据一大,就必会很慢。。
用tidyverse 中相关函数,该 是很容 ...
额,不是很明白怎么用,我检查数据的时候,发现了一下新问题,修改了一下脚本,约束的条件变多了:
data<-read.table("2.txt",header=F,fill=TRUE)
res=data.frame()
m=c(163,99)
col=nrow(data)
i=1
while(i<col){
if((data[i,4] %in% m) & (data[i+1,4] %in% m) & (data[i,4]!=data[i+1,4]) & (data[i,11]!=data[i+2,11]) & (data[i,11]==data[i+1,11])){
        res=rbind(res,data[i:(i+1),])
        i=i+2
}else{
        i=i+2
}
}

你说的那种方法我不是特别明白
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-5-17 08:39:52
不二不幸福 发表于 2018-5-16 19:14
额,不是很明白怎么用,我检查数据的时候,发现了一下新问题,修改了一下脚本,约束的条件变多了:
data
在R里面,循环本来就不快,但是你的代码,循环还不是最大问题。你的问题在于用了res=rbind(res,...), 在R中,这意味着每一次循环,都有可能需要将内存中的res变量重新寻找地址再存储一遍,而且后期随着res的变大,耗时越来越长。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-5-17 08:54:37
cheetahfly 发表于 2018-5-17 08:39
在R里面,循环本来就不快,但是你的代码,循环还不是最大问题。你的问题在于用了res=rbind(res,...), 在R ...
那除了这种方法还有没有其它方法把循环结果写入数据框啊
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群