2016-07-30 10 views
2

1つの列に数値ベクトルが含まれるデータフレームがあります。私はその列を含む条件に基づいて行をフィルタリングしたい。これは簡単な例です。R dplyr。数値ベクトルの列を含むデータフレームをフィルタリングします。

df <- data.frame(id = LETTERS[1:3], name=c("Alice", "Bob", "Carol")) 
mylist=list(c(1,2,3), c(4,5), c(1,3,4)) 
df$numvecs <- mylist 
df 
# id name numvecs 
# 1 A Alice 1, 2, 3 
# 2 B Bob 4, 5 
# 3 C Carol 1, 3, 4 

たとえば、mapplyのようなものを使用できます。

正しくしかし、私は私が代わりにmapplyのdplyrフィルタを使用するようにしたいのですが、私はできる理由を持っている第二列のためにTRUEを返し、行1および2

ためFALSE

mapply(function(x,y) x=="B" & 4 %in% y, df$id, df$numvecs) 

dplyrフィルターがnumvecs列で正しく動作するようにします。 2つの行を返す代わりに、次の行は行を返しません。

filter(df, 4 %in% numvecs) 
# [1] id  numvecs 
# <0 rows> (or 0-length row.names) 

ここでは何が欠けていますか? numvecs列を含む条件式をフィルタリングするにはどうすればよいですか?

理想的には、非標準評価フィルタも使用したいと思います。そのため、フィルタ条件を引数として渡すことができます。どんな助けもありがたい。ありがとう。

+0

でこれを行うことができます(purrr) ' – akrun

+0

DF < - data.frame(ID = LETTERS [1:3]、 mylist = list(c(1,2,3)、c(4,5)、c(1,3,4)) df $ numvecs < - mylist df – JimBoy

+0

FYI dplyrはdata.framesをそのまま使用することができますが、大きなデータを扱う場合はtbl_dfに変換する価値があります。 – smci

答えて

1

あなたはnumvecs列にsapplyを使用してサブセットのための論理ベクトルを作成することができます。

library(dplyr) 
filter(df, sapply(numvecs, function(vec) 4 %in% vec), id == "B") 
# id name numvecs 
# 1 B Bob 4, 5 

filter(df, sapply(numvecs, function(vec) 4 %in% vec)) 
# id name numvecs 
# 1 B Bob 4, 5 
# 2 C Carol 1, 3, 4 
+0

ありがとうございました。つまり、NSEを使用できることがわかりました。つまり、 – Garry

1

我々はまだfilter

filter(df, mapply(function(x,y) x == "B" & 4 %in% y, id, numvecs)) 
# id name numvecs 
#1 B Bob 4, 5 

またはpurrr

から mapを使用して mapplyを使用することができます
library(purrr) 
filter(df, unlist(map(numvecs, ~4 %in% .x))) 
# id name numvecs 
#1 B Bob 4, 5 
#2 C Carol 1, 3, 4 

それとも、我々はまた、あなたが `ライブラリから` map`を確認することができますチェーン

df %>% 
    .$numvecs %>% 
    map(~ 4 %in% .x) %>% 
    unlist %>% 
    df[.,] 
# id name numvecs 
#2 B Bob 4, 5 
#3 C Carol 1, 3, 4 
+1

ありがとうございます。 Psidomと同様に、NSEでも動作します。私はfilter_(df、 "sapply(numvecs、function(vec)4%from%vec")も動作するので、問題を解決しました。 – Garry

+0

@Garry 'map'オプションで更新しました。 – akrun

+0

もう一つのオプションは' 'purr':' filter (df、map_lgl(numvecs、function(x)any(4%in%x))) ' – Sumedh

関連する問題