library(mlbench)
data("HouseVotes84")
head(HouseVotes84)
df=HouseVotes84[complete.cases(HouseVotes84),]
df[df$Class=='democrat'& df$V1=='y' & df$V2=='n',]
如果我想过滤许多变量怎么办?
而不必写得那么多。例如
如果我想写('democrat','y','n', , ,'y','n', ...)
作为规范
在哪里我可以选择不指定一些变量。有没有方便的
这样做的方法?我试过了
paste0('df$',names(df),'==',c('democrat','y'))
然后
df[paste0('df$',names(df),'==',c('democrat','y')),]
但它不起作用
答案 0 :(得分:1)
一个想法是“滥用”data.table
语法来选择键控列(请参阅vignette("datatable-keys-fast-subset", package = "data.table")
)。
library(data.table)
dt <- HouseVotes84[complete.cases(HouseVotes84), ]
# define variables to save typing
N <- "n"
Y <- "y"
NY <- c(N, Y)
D <- "democrat"
R <- "republican"
DR <- c(D, R)
setkeyv(dt, names(dt))
key(dt)
# [1] "Class" "V1" "V2" "V3" "V4" "V5" "V6" "V7" "V8" "V9" "V10" "V11" "V12"
#[14] "V13" "V14" "V15" "V16"
dt[CJ(R, Y, N, NY, NY, Y, N), nomatch = 0]
# Class V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
#1: republican y n n y y n y n n y n n n y y y
#2: republican y n n y y n y y y n n y y y n y
#3: republican y n y y y n y n y y n n y y n y
dt[CJ(D, Y, N, NY, NY, Y), nomatch = 0]
# Class V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
#1: democrat y n n n y y n n n n y y n y n y
#2: democrat y n n n y y y n n y y n n y n y
#3: democrat y n y n y y n n n n n n n n n y
#4: democrat y n y n y y n n y y n n y y n y
#5: democrat y n y n y y y n n n y n n y n y
dt[CJ(DR, Y, N, NY, NY, Y), nomatch = 0]
# Class V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
# 1: democrat y n n n y y n n n n y y n y n y
# 2: democrat y n n n y y y n n y y n n y n y
# 3: democrat y n y n y y n n n n n n n n n y
# 4: democrat y n y n y y n n y y n n y y n y
# 5: democrat y n y n y y y n n n y n n y n y
# 6: republican y n n y y n y n n y n n n y y y
# 7: republican y n n y y n y y y n n y y y n y
# 8: republican y n n y y y n n n n y y y y n n
# 9: republican y n n y y y n n n y n y y y n n
#10: republican y n y y y n y n y y n n y y n y
#11: republican y n y y y y y y n y n y n y y y
#12: republican y n y y y y y y n y y y n y y y
答案 1 :(得分:0)
我们可以利用regex
中filter
和dplyr
函数的强大功能。
假设您有一个由filter
元素组成的n
变量,其中n
也是您定位df
数据帧的列数。
向量的每个元素都会过滤相应的列,向量中的NA
将取任何值:
例如:
filter <- c('democrat, 'y', 'y', NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
将结果是前两个投票的y
的所有民主人士,以及其余的任何人。
filter <- c('republican', 'y', 'n', NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
filter <- toString(filter) %>%
gsub(pattern = 'NA', x = ., replacement = '.+')
df %>%
unite(string, Class:V16, sep = ', ', remove = F) %>%
filter(grepl(x = string, pattern = filter)) %>%
select(-string)
# Class V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
# 1 republican y n n y y n y y y n n y y y n y
# 2 republican y n y y y n y n y y n n y y n y
# 3 republican y n y y y y y y n y n y n y y y
# 4 republican y n y y y y y y n y y y n y y y
# 5 republican y n n n n n y y y y n n n y n y