2017-06-14 26 views
8

私が最初にこれを持っているコードfrom hereで探しています:割り当て

## generate data for medical example 
clinical.trial <- 
    data.frame(patient = 1:100, 
       age = rnorm(100, mean = 60, sd = 6), 
       treatment = gl(2, 50, 
       labels = c("Treatment", "Control")), 
       center = sample(paste("Center", LETTERS[1:5]), 100, replace = 
TRUE)) 

## set some ages to NA (missing) 
is.na(clinical.trial$age) <- sample(1:100, 20) 

私はこの最後の行を理解することはできません。 LHSはすべてのFALSE値のベクトルです。 RHSは、ベクトル1:100から選択された20個の数字のベクトルです。 私はこの種の割り当てを理解していません。この結果はどのようにclinical.trial$ageにありますか?NAの値はどのようになっていますか?この種の課題には名前がありますか?せいぜい私は、RHS上のブール値ベクトルがリサイクルで割り当てられた数値を取得すると言うでしょう。

+0

LHS :-)従うことが容易だと思う同じ割り当てを行うための別の方法だと、のベクトルでありますすべてのFALSE値(NAが存在しないため)。 – amonk

+2

興味深い! 'x < - 1:3'ならば' is.na(x)< - 2'は2 – Sotos

+3

に関して 'x [2] < - NA'を解決しているようです。' is.na <動作はそれぞれのヘルプに記載されています。しかし、私はこの使い方が "直感的"なものではないことに同意します... – cryo111

答えて

5

is.na(x) <- value'is.na<-'(x, value)となります。

'is.na<-'(x, value)は、「NAxに、valueに割り当てる」と考えることができます。

おそらく、よりよく直感的なフレーズはassign_NA(to = x, pos = value)です。


他の同様の機能については、我々はベースパッケージのものを見つけることができます。

x <- as.character(lsf.str("package:base")) 
x[grep('<-', x)] 
#> [1] "$<-"      "$<-.data.frame"   
#> [3] "@<-"      "[[<-"     
#> [5] "[[<-.data.frame"   "[[<-.factor"    
#> [7] "[[<-.numeric_version" "[<-"      
#> [9] "[<-.data.frame"   "[<-.Date"    
#> [11] "[<-.factor"    "[<-.numeric_version"  
#> [13] "[<-.POSIXct"    "[<-.POSIXlt"    
#> [15] "<-"      "<<-"      
#> [17] "attr<-"     "attributes<-"   
#> [19] "body<-"     "class<-"     
#> [21] "colnames<-"    "comment<-"    
#> [23] "diag<-"     "dim<-"     
#> [25] "dimnames<-"    "dimnames<-.data.frame" 
#> [27] "Encoding<-"    "environment<-"   
#> [29] "formals<-"    "is.na<-"     
#> [31] "is.na<-.default"   "is.na<-.factor"   
#> [33] "is.na<-.numeric_version" "length<-"    
#> [35] "length<-.factor"   "levels<-"    
#> [37] "levels<-.factor"   "mode<-"     
#> [39] "mostattributes<-"  "names<-"     
#> [41] "names<-.POSIXlt"   "oldClass<-"    
#> [43] "parent.env<-"   "regmatches<-"   
#> [45] "row.names<-"    "row.names<-.data.frame" 
#> [47] "row.names<-.default"  "rownames<-"    
#> [49] "split<-"     "split<-.data.frame"  
#> [51] "split<-.default"   "storage.mode<-"   
#> [53] "substr<-"    "substring<-"    
#> [55] "units<-"     "units<-.difftime" 

をすべては'fun<-'(x, val)fun(x) <- valと同等であるという意味で同じように動作します。しかしその後、彼らはすべて正常な機能のように振る舞います。


Rのマニュアル:3.4.4 Subset assignment

+2

https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Subset-assignmentも参照してください。言語定義はそれを読む価値があります。 – Roland

+1

@GGamba、私はassign_NA()のような関数を見ないので、あなたは単にその機能を説明しようとしていたと思います。しかし、私は元のコードを取得しません。このようなやり方をする代わりに、暗号ではなく、基本的な単純なRを使う方法がありますか?テーブル()のような基本的な関数のチュートリアルでこのコードを書くのは奇妙なようです。 – matt

+1

@matt上記の私のコメントに記載したリンクをたどってください。これは「基本的なシンプルなR」です。 'x [1] < - 0'のようなことをするたびにこれを使用しています。 – Roland

0

助けを教えてくれる、その:

(xx <- c(0:4)) 
is.na(xx) <- c(2, 4) 
xx      #> 0 NA 2 NA 4 

ので、

is.na(xx) <- 1 

がより

set NA at position 1 on variable xx 
のように振る舞います
+1

私はヘルプ内で(xx < - c(0:4))is.na(xx)< - c(2,4)を見ることができますが、なぜこれが動作するのか、この種の割り当てが呼び出されたのか分かりません。 – matt

0

@matt、コメントで上記尋ねた質問に対応するために、ここで私は

clinical.trial$age[sample(1:100, 20)] <- NA