作者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/m.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