[問題] dplyr 移除特定條件

作者: memphis (讓你喜歡這世界~)   2016-01-04 15:21:30
如何用 dplyr 移除特定條件的 row (有NA的情況)
ex:
ID <- c(1:10)
VAL <- c(1,2,3,NA,5,6,7,NA,9,10)
data <- data.frame(ID, VAL, stringsAsFactors=F)
###
如果我不要5以下的
我不能寫 data %>% filter(VAL >= 6)
會沒有 NA
也許可以改成 data %>% filter(VAL >= 6 & is.na(VAL))
可是萬一資料有其他的東西 例如空格, 小老鼠之類的?
有沒有什麼辦法是 "選到符合條件的, 然後移除那些row" ?
作者: cywhale (cywhale)   2016-01-04 15:47:00
如果寫 data[-which(VAL <= 5),] 符合你所要的嗎?
作者: celestialgod (天)   2016-01-04 16:07:00
setdiff(data, data %>% filter(VAL < 6))data %>% setdiff(filter(., VAL < 6))setdiff後來dplyr有新增方法使用於data.frame
作者: memphis (讓你喜歡這世界~)   2016-01-04 16:15:00
HI cywhale 根據經驗, 那樣寫如果which=0, 資料會爆掉喔要先 s <- which(VAL <= 5) 再判斷 if(!is.na(s[1]))
作者: celestialgod (天)   2016-01-04 16:21:00
疑問,為啥which會出現0?which(data$VAL <= 5) 應該只會出現1~nrow(data)吧
作者: memphis (讓你喜歡這世界~)   2016-01-04 16:22:00
喔喔 感恩~ c大正解, 這樣寫起來就很dplyr style如果資料裡沒有<=5的 就會選空, 結果等於 integer(0)所以一般過which 我都會塞到一個s 然後判斷有沒有東西
作者: celestialgod (天)   2016-01-04 16:28:00
喔喔 你說NULL喔,我懂了!!我在想0是什麼XDDsetdiff配上%>%是真的滿dplyr style XD
作者: memphis (讓你喜歡這世界~)   2016-01-04 16:59:00
補充: 可是c大的方法好看, 速度非常慢 因為是df的setdiff
作者: cywhale (cywhale)   2016-01-04 17:00:00
ya 我忘記null這狀況,通常我也都會加個判斷式再做..
作者: memphis (讓你喜歡這世界~)   2016-01-04 17:03:00
data %>% slice(setdiff(1:nrow(.),which(VAL<6)))上面這個讓setdiff回到比兩個vector, 只是看起來就醜點
作者: celestialgod (天)   2016-01-04 17:40:00
我原本要貼這個XD:http://pastebin.com/P468HC0L不過看到cy大用-which就想說算了~~原來有差異的QQ
作者: cywhale (cywhale)   2016-01-04 21:28:00
If original column contains "@" as memphis saidthen the column become character, and these solutionswill differ from data[-which(VAL<=5),] for VAL='10'

Links booklink

Contact Us: admin [ a t ] ucptt.com