楼主: 不二不幸福
2722 20

[问答] 找到某两列顺序相反,其余字段相同的行 [推广有奖]

11
rainningpoet 发表于 2018-5-6 18:16:48
结果为什么多了这么多列? 过程变量 删掉就可以了。
library(dplyr)
data001=read.table('1.txt')
head(data001)
glimpse(data001)
data002=data001%>%mutate(new_v23_a=paste(V2,V3),new_v23_b=paste(V3,V2)
                         ,new_v56_a=paste(V5,V6),new_v56_b=paste(V6,V5)
)%>%mutate(V23_flag=ifelse(new_v23_a %in% new_v23_b,1,0)
           ,V56_flag=ifelse(new_v56_a %in% new_v56_b,1,0)
)%>%filter(V23_flag==1,V56_flag==1
)%>%select(-new_v23_a,-new_v23_b,-new_v56_a,-new_v56_b,-V23_flag,-V56_flag)

data002  
-------------------------------------------------------------------------------------
如果我只想对5、6列去顺序相反,2、3列不管:
library(dplyr)
data001=read.table('1.txt')
head(data001)
glimpse(data001)
data002=data001%>%mutate(new_v56_a=paste(V5,V6),new_v56_b=paste(V6,V5)
)%>%mutate(V56_flag=ifelse(new_v56_a %in% new_v56_b,1,0)
)%>%filter(V56_flag==1)%>%select(-new_v56_a,-new_v56_b,-V56_flag)

data002  

12
不二不幸福 发表于 2018-5-7 09:49:05
rainningpoet 发表于 2018-5-6 18:16
结果为什么多了这么多列? 过程变量 删掉就可以了。
library(dplyr)
data001=read.table('1.txt')
下面这个只针对5、6列的这个代码我试过了,没有用,一条都没过滤,输出结果和原文件一模一样

13
rainningpoet 发表于 2018-5-7 13:57:09
不二不幸福 发表于 2018-5-7 09:49
下面这个只针对5、6列的这个代码我试过了,没有用,一条都没过滤,输出结果和原文件一模一样
library(dplyr)
library(sqldf)
data001=read.table('1.txt')
head(data001)
glimpse(data001)
data002=cbind(data001,ind=1:nrow(data001))
data003=sqldf('select a.* , b.ind as ind_b from data002 a left join data002 b on a.V5=b.V6 and a.V6=b.V5  and a.ind<>b.ind')
data004=data003%>%filter(is.na(ind_b)==FALSE)%>%select(-ind_b)
data004  

14
不二不幸福 发表于 2018-5-7 16:02:16
rainningpoet 发表于 2018-5-7 13:57
library(dplyr)
library(sqldf)
data001=read.table('1.txt')
额,大神,你真的很厉害了,不过这个脚本还是还是有点问题:
E00548:177:HKH53CCXY:4:1101:10003:17307 ACAGTGGCATGT    ATGCGTACCACA    chr1    243686846       699370  15
E00548:177:HKH53CCXY:4:1101:10003:17307 ACAGTGGCATGT    ATGCGTACCACA    chr1_KI270763v1_alt     699370  243686846       16
比如这对,第4列的值是不同的,也输出了,5、6列顺序相反,其余字段的内容应该一模一样

15
rainningpoet 发表于 2018-5-7 17:56:27
不二不幸福 发表于 2018-5-7 16:02
额,大神,你真的很厉害了,不过这个脚本还是还是有点问题:
E00548:177:HKH53CCXY:4:1101:10003:17307  ...
那就加上要第四行相同

library(dplyr)
library(sqldf)
data001=read.table('1.txt')
head(data001)
glimpse(data001)
data002=cbind(data001,ind=1:nrow(data001))
data003=sqldf('select a.* , b.ind as ind_b from data002 a left join data002 b on a.V5=b.V6 and a.V6=b.V5  and a.ind<>b.ind and a.V4=b.V4 ')
data004=data003%>%filter(is.na(ind_b)==FALSE)%>%select(-ind_b)
data004  
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
不二不幸福 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

16
不二不幸福 发表于 2018-5-7 18:36:25
rainningpoet 发表于 2018-5-7 17:56
那就加上要第四行相同

library(dplyr)
完美,我算是看明白了,如果再加上第二列相同,直接就在后面加上a.V2=b.V2是吧。真的是非常感谢了,回答了我这么多!再次膜拜大神

17
不二不幸福 发表于 2018-5-7 18:46:07
rainningpoet 发表于 2018-5-7 17:56
那就加上要第四行相同

library(dplyr)
另外想再请教一下,如果输入数据过大(几十个G)的时候该怎么办,之前别人告诉过我用fread读取数据,但是R始终是先把全部数据读入内存再进行计算的,我是在服务器上运行这个脚本的,如果我用qsub提交,调用多个节点,对于读取数据有帮助吗?不太明白诶

18
rainningpoet 发表于 2018-5-7 23:17:55
不二不幸福 发表于 2018-5-7 18:46
另外想再请教一下,如果输入数据过大(几十个G)的时候该怎么办,之前别人告诉过我用fread读取数据,但是 ...
看看你服务器 RAM 大小。和你的file 大小。

library(Rtsne)
library(doParallel)
library(benchmarkme)

## Return the machine RAM
cat("RAM:         "); print (get_ram()); cat("\n")

## Return train.csv size
cat("file size:         "); print (file.size('test.csv')/1000000000); cat("GB")

2者差不多的话可以先试试

#fread
require(data.table)
data=fread("test.csv", sep = ",", header= TRUE)
head(data)

# use ff
library(ff)
data <- read.csv.ffdf(file="test.csv")

不行再参考这里
https://rstudio-pubs-static.s3.amazonaws.com/72295_692737b667614d369bd87cb0f51c9a4b.html

19
不二不幸福 发表于 2018-5-14 16:37:50
rainningpoet 发表于 2018-5-7 23:17
看看你服务器 RAM 大小。和你的file 大小。

library(Rtsne)
额,大神,打扰了,可不可以再请教一下,如果要把满足条件的数据对改为四行一组,该怎么改呢?
比如说,数据格式还是和这个一样:
1 E00548:177:HKH53CCXY:4:1101:10003:10029 TACAGACTGTGG    CTCTCCTATAGC    chr2    184106244       184106312
2 E00548:177:HKH53CCXY:4:1101:10003:10099 TGATACCGGACA    GTGCCTCATCTA    chr3    139790591       139790643
3 E00548:177:HKH53CCXY:4:1101:10003:10099 TGATACCGGACA    GTGCCTCATCTA    chr3    139790643       139790591
4 E00548:177:HKH53CCXY:4:1101:10003:10169 CTTCCATAGGCA    AGAGTTCACGGA    chr6    26713971        26713996
5 E00548:177:HKH53CCXY:4:1101:10003:10169 CTTCCATAGGCA    AGAGTTCACGGA    chr6    26713996        26713971
6 E00548:177:HKH53CCXY:4:1101:10003:10240 TAGACGTAGACG    TCAAGGAGAACC    chr14   37255539        37255588

之前找的是第2、3列顺序相反,第5、6列相同,这样的两行,但是现在扩展一下,想找找是否还有另外:这两行的第1列分别等于之前找到的数据对,且这两行互相也满足之前的条件(第2、3列顺序相反,第5、6列相同),所以最后得到的是4行为1对,格式类似于下面这种:
1111  aa bb  chr 123 134
1111  aa bb  chr 134 123
1222  bb aa  chr 134 123
1222  bb aa  chr 123 134
之前找的类似于第1、3行这样的,代码是这样
library(dplyr)
library(sqldf)
data001=read.table('1.txt')
head(data001)
glimpse(data001)
data002=cbind(data001,ind=1:nrow(data001))
data003=sqldf('select a.* , b.ind as ind_b from data002 a left join data002 b on a.V2=b.V3 and a.V3=b.V2  and a.ind<>b.ind and a.V5=b.V5 and a.V6=b.V6 ')
data004=data003%>%filter(is.na(ind_b)==FALSE)%>%select(-ind_b)
data004

请问要找这样的四行为一组应该怎么修改呢,sql语句不太懂。

20
rainningpoet 发表于 2018-5-14 20:18:45
不二不幸福 发表于 2018-5-14 16:37
额,大神,打扰了,可不可以再请教一下,如果要把满足条件的数据对改为四行一组,该怎么改呢?
比如说, ...
自己来吧。一个思路在一行中 第一行按要求left join 得到 第二 第三 第四行
然后从一行变化成四行

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-21 22:40