根据许多列的条件从数据框中选择行

时间:2017-02-28 10:03:42

标签: r

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')),]

但它不起作用

2 个答案:

答案 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)

我们可以利用regexfilterdplyr函数的强大功能。

假设您有一个由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