楼主: anchu
1539 3

[问答] 怎么遴选字符串向量中相同字符串? [推广有奖]

  • 1关注
  • 1粉丝

硕士生

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2164 点
帖子
106
精华
0
在线时间
162 小时
注册时间
2015-9-13
最后登录
2020-7-25

楼主
anchu 在职认证  发表于 2019-7-1 21:07:42 |只看作者 |坛友微信交流群|倒序 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有一个字符串向量如下:

samples <- c(
       "TCGA-A7-A13E-11A-61R-A12O-13",
       "TCGA-A7-A13F-11A-42R-A12O-13",

       "TCGA-A7-A13G-11A-51R-A13P-13",
       "TCGA-A7-A13E-01A-11R-A27D-13",

       "TCGA-A7-A45U-01A-11R-A12O-13",
       "TCGA-A7-A13G-01A-11R-A13P-13"

)

我的目的是匹配字符的前12位,找到前12位相同的字符串对,且保留该字符串对,如果未找到则删除字符串。比如,第一个字符串:"TCGA-A7-A13E-11A-61R-A12O-13"和第四个字符串"TCGA-A7-A13E-01A-11R-A27D-13"满足条件,则保留;而第二个字符串"TCGA-A7-A13F-11A-42R-A12O-13"没能匹配出与之对应的字符串,所以删除。依此类推。最后我期待得到的字符串向量为:

samples <- c(


       "TCGA-A7-A13E-11A-61R-A12O-13",                               , "TCGA-A7-A13G-11A-51R-A13P-13",                                           "TCGA-A7-A13E-01A-11R-A27D-13",                               , "TCGA-A7-A13G-01A-11R-A13P-13"


)


请求大牛给与指导,谢谢!

二维码

扫码加我 拉你入群

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

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

关键词:字符串 samples Sample AMPL les

沙发
zerofung 学生认证  发表于 2019-7-1 23:55:31 |只看作者 |坛友微信交流群
又碰到一个在经管论坛学生信的哈哈哈,我也是。
几个重要函数给你参考,首先是substr,就是把字符串截出来哪几位,duplicated,可以把重复的值标记为true(第一次出现的不被标记),其中关键参数是fromlast,设置为T可以从后面开始识别是否有重复值。
但是作为一个大坑,你要知道TCGA的barcode,是非常复杂的,一份数据中,同一个人(前12位可以保证),可以有2管甚至更多01A的标本,或者同时有01A和01B(这时需要去掉其中一个);可以同时有01A和02A但是没有11A,或者有06A和11A但是没有01A(这时需要提前筛出,要01和11都有的才纳入考虑)
只是告诉你涉及非常麻烦的筛选,仅靠一次12位的筛选是做不出来的,还要几次01和01A这样的,请谨慎,不贴代码是因为我不确保我的是最合理或者最简单的,甚至不确保是正确的,加油。
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

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

使用道具

藤椅
anchu 在职认证  发表于 2019-7-9 22:36:05 |只看作者 |坛友微信交流群
zerofung 发表于 2019-7-1 23:55
又碰到一个在经管论坛学生信的哈哈哈,我也是。
几个重要函数给你参考,首先是substr,就是把字符串截出来 ...
谢谢你富有价值回答!

在你的提醒下,我首先提取了01A和11A的样本。在此基础上,通过substr函数对字符串进行剪切,然后利用两次duplicated操作(基于fromLast=T or F)来识别重叠的样本编号,最后利用which函数得到想要的结果。代码如下,如有错误,请指教,再次感谢!

#normal
n_index <- which(as.numeric(substr(samples,14,15)) == 11)
#tumor
t_index <- which(as.numeric(substr(samples,14,15)) == 01 )

samples <- samples[c(n_index, t_index)]

#string processing for the samples name
strsub <- function(temp){
  return(substr(temp,1,12))
}

temp <- unlist(lapply(samples, strsub))

ll <- duplicated(temp, fromLast = T)
lll <- duplicated(temp, fromLast = F)

samples <- samples[c(which(ll==TRUE),which(lll==TRUE))]

使用道具

板凳
zerofung 学生认证  发表于 2019-7-10 04:12:15 |只看作者 |坛友微信交流群
anchu 发表于 2019-7-9 22:36
谢谢你富有价值回答!

在你的提醒下,我首先提取了01A和11A的样本。在此基础上,通过substr函数对字符 ...
能满足自己的需求就可以哈,我看了一下,这种方法是大部分情况都没问题的。
详细举例:
1. 某人只有(01B,01C),他没有normal的数据,但你的方法中无法剔除这个案例,因为这个案例也会有duplicated
2. 某人有(01A,01B,11A),那么你的方法中会把三个都保留,有时候处理完发现是奇数个sample
这种情况非常少见,但是做Pancancer的时候还是会碰到,所以我的中间比你多一步,在选出01和11之后,用一次duplicated,把存在两个01的去掉其中一个(就是根据1-15位来判断)
我的具体步骤:
1.挑出所有01和11
2.前15位有重复的只保留一个
3.挑出前12位有重复的

加油!!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-22 14:16