2017-02-28 8 views
1
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')),] 

を試してみましたが、それは我々がdplyrregexのパワーとfilter機能を活用することができます

+2

私は 'evalの(パース()'動作するはずであなたのpaste0を囲む前提としています。 – Tensibai

+2

良いアイデアは(DF、{クラス= '民主主義' &V1 == 'Y' &V2と 'かもしれない== 'n'}) 'それはあなたにデータセット名だけを保存しますが、これは最も安全な方法です。数値列をベクトルとしてフィルタリングする場合は、値の元となるベクトルが問題になります – Tensibai

答えて

0

を動作しません。あなたはnはまた、あなたの列dfデータフレームをターゲットの数であるn要素で構成filter変数を、持っていると仮定すると、

ベクトルの各要素がベクトル内の各列及びNA sは任意の値をとるフィルタであろう:例えば

:全民主党を結果として

filter <- c('democrat, 'y', 'y', NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) 

は投票yでを与えます最初の2つ、残りは何でも。

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 
+0

あなたのコードについていくつか説明していただけますか?数値的な条件(>、<、etc ..)があればどうなるでしょうか?事前にありがとうございます! – staove7

1

ひとつのアイデアは、(vignette("datatable-keys-fast-subset", package = "data.table")を参照)キー付きの列を選択するために、「誤用」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 
関連する問題