2017-11-28 4 views
3

データフレーム内の特定の値のインスタンスをすべて検索し、それらをNAに置き換えようとしています。私はこれと同じだと思うこの2つの異なる方法を試しましたが、私は異なる結果を得ます。たとえば:| Rはデータフレーム内の値を|演算子vs%in%

df <- data.frame(a=c(1,2),b=c(3,4)) 
df[df == 1 | df == 4] <- NA 

は私に期待される結果が得られます。

df 
# a b 
# 1 NA 3 
# 2 2 NA 

df <- data.frame(a=c(1,2),b=c(3,4)) 
df[df %in% c(1,4)] <- NA 

一方は何もしません:

df 
# a b 
# 1 1 3 
# 2 2 4 

これは私が使用している場合は理由のようです"|"演算子では、データフレーム要素を要素で検索しますが、%で%を使用すると、データフレームベクトルをベクトル(列単位)で検索しますが、理由はわかりません。私たちはそう%in%

function (x, table) 
match(x, table, nomatch = 0L) > 0L 

ためのコードを見れば

df <- data.frame(a=c(1,2),b=c(3,4)) 
df == 1 | df == 4 
#   a  b 
# [1,] TRUE FALSE 
# [2,] FALSE TRUE 

df %in% c(1,4) 
# [1] FALSE FALSE 
+0

'%in%'は、あなたがdata.frameに必要な方法では動作しません。それはベクトルで動作します – akrun

答えて

3

、それは基本的にmatchを行っています。 matchの出力は

match(c(1,4), df, nomatch = 0L) > 0L 
#[1] FALSE FALSE 

%in%vectorの代わりにdata.frameに適用されることになります。私たちはどのようにmatrixが必要な場合そこで、我々lapplyを使用して列をループは、その後、%in%

lapply(df, `%in%`, c(1, 4)) 

を行い、その後、sapply

df[sapply(df, `%in%`, c(1, 4))] <- NA 

を使用我々はvector

match作品をチェックできます
sapply(df, match, x = c(1,4), nomatch = 0L) > 0 
#   a  b 
#[1,] TRUE FALSE 
#[2,] FALSE TRUE 
2

%in%はベクターのみです。データフレームでそれを実行するには、各列に機能を適用するためにsapplyを使用する必要があります。

df[sapply(df, function(x) x %in% c(1, 4))] <- NA 

    a b 
1 NA 3 
2 2 NA