[问题] 如何一次检查多个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