2017-02-08 36 views
11

Sadece anlamıyorum is.na() fonksiyonunun aşağıdaki davranışını keşfetti:Neden .na() argümanını değiştiriyor?

df <- data.frame(a = 5:1, b = "text") 
df 
## a b 
## 1 5 text 
## 2 4 text 
## 3 3 text 
## 4 2 text 
## 5 1 text 
is.na(df) 
##   a  b 
## [1,] FALSE FALSE 
## [2,] FALSE FALSE 
## [3,] FALSE FALSE 
## [4,] FALSE FALSE 
## [5,] FALSE FALSE 
is.na(df) <- "0" 
df 
## a b 0 
## 1 5 text NA 
## 2 4 text NA 
## 3 3 text NA 
## 4 2 text NA 
## 5 1 text NA 

onun argüman değiştirmek is.na() yapar Neden (ve bu durumda verilere fazladan bir sütun ekler
Sorum çerçeve)? Bu durumda, davranışı tüm örneklerde FALSE olduğu için, davranışı çok şaşırtıcı (veya en azından beklenmedik) görünüyor.

NB
Bu soru alt küme oluşturma ve veri çerçeve içinde NA değerlerini değiştirme konusunda değil - O (df[is.na(df)] <- "0") nasıl yapılacağını biliyorum. Bu soru, is.na işlevinin davranışı hakkında! Neden bir is.something öğesinin ataması argümanın kendisini değiştiriyor? Bu beklenmedik bir durumdur.

+0

Bu mantıksal değişkenleri dizin başvurusu olarak kullanmanız gerekir, yani 'df [is.na (df)] <- 0' – Sotos

+0

@Sotos: Lütfen yorumuma bakın. – vonjd

+0

@vonjd Yorumunuzu gördüm, ancak amacım, NA değerleri olsa bile atamanızın çalışmadığıdır; yani df $ a [3] <- NA; is.na (df) <- "0" ' – akrun

cevap

14

Burada kullanılan gerçek işlev, is.na() değil, varsayılan yöntem `is.na<-.default` olan atama işlevi `is.na<-` değil. bu işlevi yazdırma gördüğümüz konsola:

function (x, value) 
{ 
    x[value] <- NA 
    x 
} 

Yani açıkça, value burada bir dizin olması gerekiyordu. Bir data.frame'u df["0"] gibi dizine eklerseniz, "0" adlı sütunu seçmeye çalışır. , öğelerini df["0"]'a atarsanız, sütun (bu durumda) NA ile oluşturulur ve doldurulur.

NA için, `is.na<-` setleri değerlerini açıklığa kavuşturmak için, değil başka bir şeyle NA değerlerin yerini yapar.

+0

Teşekkürler, bu yüzden kaçırdığım nokta bu durumda oldu 'a.na'ya bir atama aslında * NA'lara * değerlerini ayarlar. Bunu asla * asla * düşünürdüm. – vonjd

+2

Bu belgelenmiştir ama belki biraz şaşırtıcı, evet. – Axeman

+0

Tam olarak, rownames() ve colnames() işlevlerinin tıpkı diğer örneklerde olduğu gibi aynıdır. Bunlar hem ayarlanıyor hem de ayarlanıyor. Aslında çok tutarlı bir sözdizimi. – Elin

İlgili konular