楼主: 不二不幸福
2831 8

[问答] 一个小脚本,数据也不大,为什么跑了很久都没跑完 [推广有奖]

  • 0关注
  • 1粉丝

硕士生

33%

还不是VIP/贵宾

-

威望
0
论坛币
161 个
通用积分
2.8500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1641 点
帖子
76
精华
0
在线时间
160 小时
注册时间
2017-9-26
最后登录
2024-6-14

楼主
不二不幸福 发表于 2018-5-16 14:47:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
数据格式是这样的:
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万多行,为什么会跑这么慢?是我陷入死循环了?还是这个脚本本身就有问题?
二维码

扫码加我 拉你入群

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

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


沙发
jgchen1966 发表于 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 赋值 ,该 是这样。。
四,后面,就很简单了,无须再写了吧。。
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

藤椅
jgchen1966 发表于 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
}
}

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

报纸
cheetahfly 在职认证  发表于 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 ...
那除了这种方法还有没有其它方法把循环结果写入数据框啊

7
cheetahfly 在职认证  发表于 2018-5-17 09:13:44
不二不幸福 发表于 2018-5-17 08:54
那除了这种方法还有没有其它方法把循环结果写入数据框啊
你可以先建一个大小和原数据一样,但是里面全是NA的dataframe,然后用循环过一遍,最后把目标dataframe中仍然是空值的行全部去除,都能节省不少时间,不过最好是不用循环。

8
不二不幸福 发表于 2018-5-17 09:26:40
cheetahfly 发表于 2018-5-17 09:13
你可以先建一个大小和原数据一样,但是里面全是NA的dataframe,然后用循环过一遍,最后把目标dataframe中 ...
那循环结果怎么写入数据框,直接data.frame(res,data[i:i+1,]) ?有人建议我用tidyverse,但是不会这个包,只会这种简单的循环

9
cheetahfly 在职认证  发表于 2018-5-17 10:53:24
res[i:(i+1), ] <- data[i:(i+1), ]

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-7 23:56