R_Language 板


LINE

[問題類型]: 程式諮詢(我想用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開頭" 再做一次... -- So stand by your glasses steady, Here’s good luck to the man in the sky, Here’s a toast to the dead already, Three cheers for the next man to die. --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.222.252 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1599453865.A.4D5.html ※ 編輯: daze (118.163.222.252 臺灣), 09/07/2020 12:54:34
1F:→ locka: 代碼N裡面有可能出現033開頭的值嗎? 09/07 14:06
代碼1 ~ 代碼N 都可能出現O33開頭的值 N的數量不固定 用 filter_at 可以抓 column name 裡面有"代碼"開頭的columns 另外還可能有其他開頭不是"代碼"的columns 這些columns不可列入檢查
2F:→ andrew43: 我覺得先把pattern字串寫在一個向量,用for loop就好了 09/07 17:15
3F:→ andrew43: 最後再cbind或join 09/07 17:15
4F:→ andrew43: https://ideone.com/tzgHfc 09/07 17:23
這個code只在代碼1比對 O33, 在代碼2比對 O34。 在代碼2出現O33就不行了。 當然寫成巢狀 for loop也可以 但是這樣實現的話 使用 filter_at 的簡潔度與可讀性可能更好些 而且在N會變動的情況下 巢狀 for loop 會更麻煩些 ※ 編輯: daze (114.40.18.158 臺灣), 09/07/2020 18:14:49
5F:→ andrew43: 那只要寫出合適的pattern還是可以不改結構的。 09/07 18:35
6F:→ andrew43: N會變動應該不麻煩,用ncol()幫忙一下。 09/07 18:36
7F:推 JuanMaestrow: 先gather起來變成只有一個column是代碼。mutate用st 09/08 13:42
8F:→ JuanMaestrow: r_detect搭配regex。做完再speead出去就可以了 09/08 13:42
更之前有試著用 reshape2::melt/dcast 行為跟 tidyr::gather/spread 應該很類似 不過有個問題是 melt 後 dataframe 會變大好幾倍 比較小的檔案可以這麼做,但6G的檔案變大10倍,記憶體就爆了 當時的做法是把某些暫時不用的 column 抽掉先把檔案瘦身 跑完 melt/dcast 之後再 join 回去 但這樣當然比較麻煩,又容易出錯 目前處理的檔案大小,最大就 10G 左右 剛好落在用 filter_at 不會爆而用 melt 就會爆的狀態 filter_at 在效能上對我來說其實剛好夠用,能用的參數也算方便 但 filter_at 為了 filter,應該本來就會為每一 row 產生一個邏輯值 我主要的困擾是 希望有現成的類似函式可以直接產生該邏輯值寫入新 column 而不必使用 filter_at 生成新 dataframe 再 join 回去 從而可以直接對 patterns list 做 lapply ※ 編輯: daze (114.40.18.158 臺灣), 09/08/2020 16:53:57 做兩次 lapply 再 cbind,最後把 column name 改掉。 缺點是可能過兩個月我就搞不清這段code的作用了。 require(dplyr) df<- read.csv(...) pattern.list <- c("^O33", "^O34") CNames<-colnames(df) df<-df %>% cbind( lapply( pattern.list, function(y) Reduce("|", lapply(select(.,starts_with("代碼")), function(x) grepl(y, x))))) colnames(df)<-c(CNames,pattern.list) ※ 編輯: daze (114.40.18.158 臺灣), 09/08/2020 21:56:34 這樣似乎稍微好一點... cbind(df, lapply(pattern.list, function(x) df %>% rowwise() %>% summarise( (sum(grepl( x, across(starts_with("代碼"))))>0)))) 但這樣不是非常有效率 跑 1.7M rows, 在 6個 column中比對1個pattern, 大概要 3~4 分鐘 用一開始的 filter_at 實現同樣的比對則要花... 3 秒鐘。 ※ 編輯: daze (114.40.18.158 臺灣), 09/08/2020 23:32:04
9F:推 intotherain: 用across+1 很精煉的寫法耶 09/09 09:36
10F:推 JuanMaestrow: 我沒有叫你melt阿。gather跟spread好很多。你不要 09/09 20:06
11F:→ JuanMaestrow: 自己跑去用melt 09/09 20:06
試著讀了一個約 5G 的 CSV 檔進來 (12568899 rows x 43 columns) Rstudio 顯示 data.frame 大小是 6259133200 bytes 將 6 個代碼欄 gather 成一個 data.frame 大小變成 22696429616 bytes 在工作管理員中, Rsession.exe 的記憶體用量則約 28G 電腦開始 lag, 畢竟實體記憶體只有 32G 把 R 重啟後,用 melt 做同樣的操作 data.frame 大小變成 22394776472 bytes 電腦仍然開始 lag 所謂 gather 比 melt 好很多,具體是指哪方面? ※ 編輯: daze (36.237.70.94 臺灣), 09/09/2020 23:24:29
12F:推 cywhale: 我不知道有無誤解題意 如果pattern是有限個 比如 09/11 12:28
13F:→ cywhale: pat=c("033","034","035"); chkhead<-function(x){matrix 09/11 12:34
14F:→ cywhale: pat%in%substr(x,1,3)),ncol=3)} 用apply(df,1,chkhead) 09/11 12:36
15F:→ cywhale: 如果有速度需求可以拆平行做或者分批 如果記憶體不夠?.. 09/11 12:38
※ 編輯: daze (114.39.55.253 臺灣), 09/13/2020 22:00:23 ※ 編輯: daze (114.39.55.253 臺灣), 09/14/2020 23:53:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP