※ 引述《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