楼主: pxh3280
22364 11

[问答] 求问用R如何根据特定的条件筛选需要的数据 [推广有奖]

  • 0关注
  • 0粉丝

初中生

23%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
55 点
帖子
7
精华
0
在线时间
16 小时
注册时间
2017-7-18
最后登录
2017-7-27

楼主
pxh3280 发表于 2017-7-20 10:27:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
这个是小弟手头的一组数据(经过简化)
第三列为数据类型,四五列为跨越长度,第九列为特征ID,其余不管

1、首先我想只留下表1第三列为A的行,把A1A2A3的列都去掉,变成表2那样
2、其次,比如以EF为出发点,我想提取出以四五列的长度为依据,向上200、向下200距离的特征ID。比如EF的跨度是301到400,要把它上面100-300的AB,CD的ID,下面400-600的GH,IJ的ID提取出来
3、再进一步,如果要从CD,IL出发,分别同时把CD上下的AB,EF和IL上下的GH,KL的ID提取出来
求问用R应该如何写出程序? 谢谢各位

chr1HAVANAA

100

200

.+.ID = AB
chr1HAVANAA1

100

120

.+.ID = AB
chr1HAVANAA2

121

156

.+.ID = AB
chr1HAVANAA3

157

200

.+.ID = AB
chr1HAVANAA

201

300

.+.ID = CD
chr1HAVANAA1

201

267

.+.ID = CD
chr1HAVANAA2

268

289

.+.ID = CD
chr1HAVANAA3

289

300

.+.ID = CD
chr1HAVANAA

301

400

.-.ID = EF
chr1HAVANAA1

301

345

.-.ID = EF
chr1HAVANAA2

346

378

.-.ID = EF
chr1HAVANAA3

378

400

.-.ID = EF
chr1HAVANAA

401

500

.-.ID = GH
chr1HAVANAA1

401

434

.-.ID = GH
chr1HAVANAA2

434

477

.-.ID = GH
chr1HAVANAA3

477

500

.-.ID = GH
chr1HAVANAA

501

600

.-.ID = IJ
chr1HAVANAA1

501

524

.-.ID = IJ
chr1HAVANAA2

524

568

.-.ID = IJ
chr1HAVANAA3

568

600

.-.ID = IJ
chr1HAVANAA

601

700

.-.ID = KL
chr1HAVANAA1

601

647

.-.ID = KL
chr1HAVANAA2

647

700

.-.ID = KL
表1

chr1HAVANAA

100

200

.+.ID = AB
chr1HAVANAA

201

300

.+.ID = CD
chr1HAVANAA

301

400

.-.ID = EF
chr1HAVANAA

401

500

.-.ID = GH
chr1HAVANAA

501

600

.-.ID = IJ
chr1HAVANAA

601

700

.-.ID = KL
表2
二维码

扫码加我 拉你入群

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

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

关键词:条件筛选 数据类型 CHR Van CDC

回帖推荐

colinxf 发表于8楼  查看完整内容

第一个问题:字符串截取,截取第6个到7个字符,也就是把“ID = AB”的“AB”提出来 第二个问题:把所有的筛选出来了,你想从那个ID开始,你直接从结果中选取就可以了 第三个问题:

沙发
colinxf 学生认证  发表于 2017-7-20 13:55:14
2,3条件有点含糊,不好明白作者的意图

藤椅
pxh3280 发表于 2017-7-20 14:29:34
colinxf 发表于 2017-7-20 13:55
2,3条件有点含糊,不好明白作者的意图
对于第二点,说的就是只剩下第三列是A的行,其他行都删掉
对于第三点,其实可以这样理解,我从中间的一行出发,比如ID=GH那行,然后对于第四列的其他变量,减去它在+-100以内,我就把对应的ID提取出来,比如301-401=-100,于是把ID=EF取出,下面的501-401=100,于是把ID=IJ提出,用这个条件,我就筛选出了ID=EF和ID=IJ这两个元素

板凳
colinxf 学生认证  发表于 2017-7-20 14:41:29
分别对每一个ID进行对4列5列上下100之内的匹配?

报纸
pxh3280 发表于 2017-7-20 15:04:47
colinxf 发表于 2017-7-20 14:41
分别对每一个ID进行对4列5列上下100之内的匹配?
第二部我已经做出来,现在就差第三步

这样说吧,首先我要根据ID名称检索出它所在行数,然后得到所在行的start值或是end值,然后用start值或是end值减去同列的其他所有数值,在一定范围内的我就把对应的ID值提取出来,或者是整行都提取出来

地板
colinxf 学生认证  发表于 2017-7-21 10:57:22
pxh3280 发表于 2017-7-20 15:04
第二部我已经做出来,现在就差第三步

这样说吧,首先我要根据ID名称检索出它所在行数,然后得到所在行 ...
  1. setwd("D:/")
  2. library(stringr)
  3. da<-read.csv("E:/data/R/name1.csv")
  4. da<-da[which(da[,3]=="A"),]
  5. n<-dim(da)[1]
  6. ##第四列
  7. for (i in 1:n)
  8. {
  9.   dis<-abs(da[,4]-da[i,4])
  10.   re<-da[which(dis<=100),]
  11.   name<-as.character(da[i,9])
  12.   name<-substr(name,6,7)
  13.   write.table(re,file=paste(name,"-4.txt",sep=""),row.names = F,col.names = F)
  14.   #每个ID相邻的数据都会输出到一个以该ID命名的txt文档中
  15. }
  16. #同理可得到第5列
  17. for (i in 1:n)
  18. {
  19.   dis<-abs(da[,5]-da[i,5])
  20.   re<-da[which(dis<=100),]
  21.   name<-as.character(da[i,9])
  22.   name<-substr(name,6,7)
  23.   write.table(re,file=paste(name,"-5.txt",sep=""),row.names = F,col.names = F)
  24.   #每个ID相邻的数据都会输出到一个以该ID命名的txt文档中
  25. }
复制代码

7
pxh3280 发表于 2017-7-21 11:58:06
谢谢,但我想问  “name<-substr(name,6,7)”   这里的6和7是什么意思呢?  
而且如果我想从任一一个ID开始的话,如何在for循环里写明?   
用您写的这些代码,我最后出的结果是第五行和第六行整行的数据,如果我只想要AB,CD,EF这些标志,是否有办法实现呢。
谢谢

8
colinxf 学生认证  发表于 2017-7-22 13:38:17
第一个问题:字符串截取,截取第6个到7个字符,也就是把“ID = AB”的“AB”提出来
第二个问题:把所有的筛选出来了,你想从那个ID开始,你直接从结果中选取就可以了
第三个问题:
  1. setwd("D:/")
  2. library(stringr)
  3. da<-read.csv("E:/data/R/name1.csv")
  4. da<-da[which(da[,3]=="A"),]
  5. n<-dim(da)[1]
  6. #把数据中的“ID=”去掉
  7. da[,9]<-sapply(da[,9],function(x){substr(x,6,7)})
  8. ##第四列
  9. for (i in 1:n)
  10. {
  11.   dis<-abs(da[,4]-da[i,4])
  12.   re<-da[which(dis<=100&dis>0),9]
  13.   re<-c(da[i,9],re)
  14.   re=t(re)
  15.   write.table(re,file="start.txt",row.names = F,col.names = F,append=T,quote =F)
  16.   #结果中每一行的第一个就是目标ID,后面的就是距离这个目标ID在100范围内的ID
  17. }
  18. #同理可得到第5列
  19. for (i in 1:n)
  20. {
  21.   dis<-abs(da[,5]-da[i,5])
  22.   re<-da[which(dis<=100&dis>0),9]
  23.   re<-c(da[i,9],re)
  24.   re=t(re)
  25.   write.table(re,file="end.txt",row.names = F,col.names = F,append = T,quote =F)
  26. }
复制代码

9
pxh3280 发表于 2017-7-22 14:08:07
colinxf 发表于 2017-7-22 13:38
第一个问题:字符串截取,截取第6个到7个字符,也就是把“ID = AB”的“AB”提出来
第二个问题:把所有的 ...
非常感谢您的解答,我还有一些问题,希望您不吝赐教
1. 每次循环都会得到一个ID,如果我希望每次得到的ID都储存为一行,最后只输出一个单独的表格
2. 提取每次循环得到ID的所在行,将整行提取出,并最终输出为一个单独的表格
要做到这两点请问应该怎么写呢?

10
colinxf 学生认证  发表于 2017-7-22 14:12:23
第一点已经做到了,就是把每个ID相邻的都存在了一行。

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

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