作者huangsam (sam)
看板R_Language
标题[讨论] grepl与回圈使用
时间Mon Oct 17 16:20:52 2016
[问题类型]:
效能谘询(我想让R 跑更快)
[软体熟悉度]:
请把以下不需要的部份删除
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
请简略描述你所要做的事情,或是这个程式的目的
手上有两个档案,分别是参照表以及原始档
其中一个参照表为
EX:
档案DT
1 ^123.* A
2 ^234.* B
.
.
.
原始档为
档案DT2
1. 123456
2. 23456
经由比对可以发现
1.=>为A
2.=>为B
[你的答案]:
我的写法是用回圈方式然後
想请问有没有更好的写法
ansewer <- c()
for (i in 1:nrow(DT))
{
ind <- grepl(DT[i, 1, with=F], DT2)
for(j in which(ind==1))
{
ansewer[j] <- ifelse(TYPE[j]==0, DT2[i],ansewer[j] )
}
}
[关键字]:
grepl
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.51.170.56
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1476692454.A.C19.html
※ 编辑: huangsam (123.51.170.56), 10/17/2016 16:27:14
※ 编辑: huangsam (123.51.170.56), 10/17/2016 16:27:56
1F:推 clansoda: Hi,所以DT里面是正则表示式而DT2里面应该是本值罗 10/17 17:27
2F:→ clansoda: lapply(DT[,1],function(k) {grep(k,DT2$whatever)} 10/17 17:29
3F:→ clansoda: 我猜你是想知道DT的正则表示式能符合DT2的哪些值 10/17 17:29
4F:→ clansoda: 我这个写法就不需要包两个loop这麽麻烦了,每个list的el 10/17 17:29
5F:→ clansoda: element都是符合DT里面正则表示式的rownumber 10/17 17:30
6F:→ clansoda: 阿,我lapply忘记用 )包起来,要加进去才能用 10/17 17:31
我是想要知道它里面有哪些值没错,但是有个条件如果之前有比对出来就以先比对出来
的为主,所以才会多个回圈判断。
若是grepl(DT[i, 1, with=F], DT2)有多个条件有比较好的写法吗?
我是用grepl(DT[i, 1, with=F], DT2_1)*grepl(DT[i, 2, with=F], DT2_2),表示
两个条件都要符合才可以
※ 编辑: huangsam (123.51.170.56), 10/17/2016 17:47:46
7F:推 clansoda: 例如DT2有一个值符合两种正则表示式,则使用顺位在前的 10/17 17:56
8F:→ clansoda: 作为该值的编号吗? 10/17 17:56
顺序在前面且之前没有被比对出来
EX:
A在1.3.5.7有比对出来就是A
B在1.4.9 因为1前面有比对出来A所以这次只有4.9是B
※ 编辑: huangsam (123.51.170.56), 10/17/2016 18:14:54
9F:→ celestialgod: clansoda最後会变成要有很多data.table组起来 10/17 20:50
10F:→ celestialgod: 那样会相对不方便很多,建议还是用set做 10/17 20:50
11F:推 clansoda: 我的前提是用dataframe做拉XDD,我没用datatable做 10/17 23:27