2017-02-28 71 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')),] 

,但它不工作

+2

我想用'包圍的eval您paste0(解析()'應該工作。 – Tensibai

+2

更好的方法可能是用'(DF,{CLASS = '民主派' 和V1 == 'Y' 和V2 == 'n'})'它只會保存數據集名稱,但這是最安全的方式,如果您想要在數值列上過濾某個點作爲向量,那麼後面(作爲值源的向量)將會成爲問題不能混合類型 – Tensibai

回答

0

我們可以利用的regex的功率和dplyrfilter功能。

假設你有一個filter變量,n元素,其中n也列數的您定位df數據幀組成。

例如::

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

會給作爲導致所有在投y民主主義

載體將過濾載體中的相應列和NA旨意取任何值中的每一個元素前兩個,其餘的都是。

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

你能給我一些關於你的代碼的解釋嗎?如果你有「數字」條件(>,<等等),它會是什麼樣子?提前謝謝! – staove7

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 
相關問題