推 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