[問題] 如何一次檢查多個column的字串

作者: daze (一期一會)   2020-09-07 12:44:18
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
入門(寫過其他程式,只是對語法不熟悉)
[問題敘述]:
代碼儲存在複數欄位中,希望檢查是否有某些欄位符合特定字串規則,輸出True or False
目前用 dplyr::filter_at 是可以得到需要的結果
但需要另外產生一個data.frame再join回來
且要檢查多組不同字串規則時變得更為冗長
想問看看有沒有更好的寫法
ex:
ID 代碼一 代碼二 ... 代碼N
1 O33 O34 O354
2 O331 O354
3 OO33 O345
需要的結果
ID 代碼一 代碼二 ... 代碼N O33開頭 O34開頭 ...
1 O33 O34 O354 True True
2 O331 O354 True False
3 OO33 O345 False True
[程式範例]:
df <- read.csv( ...... )
require(dplyr)
dftemp <- filter_at(df, vars(starts_with("代碼")), any_vars(grepl("^O33", .)))
dftemp$O33開頭 <- True
df <- left_join(df, dftemp )
df$O33開頭 <- ifelse( is.na(df$O33開頭), False, True)
然後為 "O34開頭" 再做一次...
作者: locka (locka)   2020-09-07 14:06:00
代碼N裡面有可能出現033開頭的值嗎?
作者: andrew43 (討厭有好心推文後刪文者)   2020-09-07 17:15:00
我覺得先把pattern字串寫在一個向量,用for loop就好了最後再cbind或joinhttps://ideone.com/tzgHfc
作者: JuanMaestrow (多多)   2020-09-08 13:42:00
先gather起來變成只有一個column是代碼。mutate用str_detect搭配regex。做完再speead出去就可以了
作者: intotherain (我不是洨母>"<)   2020-09-09 09:36:00
用across+1 很精煉的寫法耶
作者: JuanMaestrow (多多)   2020-09-09 20:06:00
我沒有叫你melt阿。gather跟spread好很多。你不要自己跑去用melt
作者: cywhale (cywhale)   2020-09-11 12:28:00
我不知道有無誤解題意 如果pattern是有限個 比如pat=c("033","034","035"); chkhead<-function(x){matrixpat%in%substr(x,1,3)),ncol=3)} 用apply(df,1,chkhead)如果有速度需求可以拆平行做或者分批 如果記憶體不夠?..

Links booklink

Contact Us: admin [ a t ] ucptt.com