精華區beta R_Language 關於我們 聯絡資訊
大家好, 我是R的新手, 下列問題若過於簡單請多包涵~~ 目前有資料如下: A B C D E F 1 96 1 NA NA 3 NA NA NA NA 96 NA 1 0 1 0 1 2 A~F是欄位名稱, 我想把只要A~F中有96者的紀錄整筆刪除, 指令下這樣: d<-data[!(A==96|B==96|C==96|D==96|E==96),] 可是跑不出正確的筆數, 想請問這樣寫是否哪邊要更正? 或有其他寫法, 謝謝大家~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.233.7.232 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1510737606.A.0DD.html
sw52099: 我照著打是error,用with包住就對了,不過看原po的意思好 11/15 17:40
sw52099: 像原本沒有出現error? 11/15 17:40
> -------------------------------------------------------------------------- < 作者: HumuHumu (呼姆呼姆) 看板: R_Language 標題: Re: [問題] 根據條件刪除資料 時間: Wed Nov 15 17:27:05 2017 ※ 引述《Whatfor (Live for what?)》之銘言: : 大家好, : 我是R的新手, : 下列問題若過於簡單請多包涵~~ : 目前有資料如下: : A B C D E F : 1 96 1 NA NA 3 : NA NA NA NA 96 NA : 1 0 1 0 1 2 : A~F是欄位名稱, : 我想把只要A~F中有96者的紀錄整筆刪除, : 指令下這樣: : d<-data[!(A==96|B==96|C==96|D==96|E==96),] : 可是跑不出正確的筆數, : 想請問這樣寫是否哪邊要更正? : 或有其他寫法, : 謝謝大家~ 可以用apply找出哪些row含有96,然後去掉這些row 可能有其他版友有更好的方法也可以分享一下 https://pastebin.com/wEMeEY1w 你那樣的寫法必須要先定義ABCDE是什麼東西 不然他會顯示沒有這個物件 或是要用data$A才能正確的判別A是data這個data.frame裡面的一個欄位 d<-data[!(data$A==96|data$B==96|data$C==96|data$D==96|data$E==96),] 或是先 attatch(data) 再 d<-data[!(A==96|B==96|C==96|D==96|E==96),] 才可以抓到ABCDE這些物件 還有一種方法是用with with(data,data[!(A==96|B==96|C==96|D==96|E==96),]) 還有一個資料整理神器dplyr 但這我不常用 library(dplyr) filter(df,A!=96,B!=96,C!=96,D!=96,E!=96) 以上 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.53.208 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1510738028.A.FCE.html ※ 編輯: HumuHumu (140.114.53.208), 11/15/2017 17:50:43 > -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] 根據條件刪除資料 時間: Wed Nov 15 21:19:52 2017 ※ 引述《Whatfor (Live for what?)》之銘言: : 大家好, : 我是R的新手, : 下列問題若過於簡單請多包涵~~ : 目前有資料如下: : A B C D E F : 1 96 1 NA NA 3 : NA NA NA NA 96 NA : 1 0 1 0 1 2 : A~F是欄位名稱, : 我想把只要A~F中有96者的紀錄整筆刪除, : 指令下這樣: : d<-data[!(A==96|B==96|C==96|D==96|E==96),] : 可是跑不出正確的筆數, : 想請問這樣寫是否哪邊要更正? : 或有其他寫法, : 謝謝大家~ 讀入資料: library(data.table) DT <- fread("A B C D E F 1 96 1 NA NA 3 NA NA NA NA 96 NA 1 0 1 0 1 96 ") # 一般解法: DF <- copy(DT) setDF(DF) idx <- Reduce(`&`, lapply(names(DF)[1:5], function(c) DF[[c]] != 96)) DF[idx, ] # A B C D E F # 3 1 0 1 0 1 96 # dplyr 解法 library(dplyr) tbl <- tbl_df(DT) filter_(tbl, .dots = paste0(LETTERS[1:5], "!='", 96, "'")) # # A tibble: 1 x 6 # A B C D E F # <int> <int> <int> <int> <int> <int> # 1 1 0 1 0 1 96 # data.table解法 DT[ , removeRow := Reduce(`|`, lapply(.SD, `==`, 96)), .SDcols = names(DT)[1:5]] DT2 <- DT[removeRow == FALSE][ , removeRow := NULL] # A B C D E F # 1: 1 0 1 0 1 2 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.55.84 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1510751995.A.C6A.html