分配给 is.na(clinical.trial$age)

Posted

技术标签:

【中文标题】分配给 is.na(clinical.trial$age)【英文标题】:assign to is.na(clinical.trial$age) 【发布时间】:2017-11-16 14:09:23 【问题描述】:

我正在查看代码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 上的布尔向量通过回收获得分配给它的数字。

【问题讨论】:

LHS 是所有 FALSE 值的向量(因为不存在 NA)。 有趣!所以如果x &lt;- 1:3 那么is.na(x) &lt;- 2 似乎我们正在解决关于2 的x[2] &lt;- NA is.na&lt;- 行为在各自的帮助中进行了描述。但我同意这种用法远非“直观”...... 有谁知道是否还有更多功能,包括该功能(colnames()、class()、....)?我有兴趣了解为什么这样做(显然仅在某些功能(?)中,但不是全部)而不是重述现有文档,.... “那个功能”是什么意思?函数的赋值变体?这只是方便。最重要的例子是`[&lt;-`(子集赋值)。 【参考方案1】:

is.na(x) &lt;- value 被翻译为'is.na&lt;-'(x, value)

您可以将'is.na&lt;-'(x, value) 视为“将NA 分配给x,在位置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&lt;-'(x, val) 等价于fun(x) &lt;- val 的意义上,所有的工作方式都相同。但在那之后,它们的行为都像任何普通函数一样。


R 手册:3.4.4 Subset assignment

【讨论】:

另见cran.r-project.org/doc/manuals/r-release/…。语言定义值得一读。 @GGamba,我没有看到任何像 assign_NA() 这样的函数,所以我猜你只是想解释这个功能。但我没有得到原始代码。有没有另一种方法可以做到这一点,它并不神秘,只使用基本的简单 R?把这段代码放在一个关于 table() 之类的基本函数的教程中似乎很奇怪 @matt 请点击我在上面评论中提供的链接。这是“基本的简单 R”。每次执行x[1] &lt;- 0 之类的操作时都会使用它。 @Roland,在 x[1] 我在这里讨论的是语法,而不是这些函数的作用。他们只有共同的任务。语言定义清楚地解释了解析器如何解释这种语法。除了语法,这是语言的核心部分,正如我试图用示例 [ 【参考方案2】:

帮助告诉我们:

(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

【讨论】:

我可以在帮助中看到 (xx 【参考方案3】:

@matt,为了回答您在 cmets 中提出的问题,这里有另一种方法来完成我认为更容易遵循的相同任务:-)

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

【讨论】:

以上是关于分配给 is.na(clinical.trial$age)的主要内容,如果未能解决你的问题,请参考以下文章

在为选定列分配变量后,如何删除一些具有 NA 值的行?

如何在调整后的折叠更改代码中使用 is.na 或 is.infinite 覆盖数据帧中的 NA? [关闭]

R语言is.na函数实战(删除替换统计条件判断等)

在包含 is.na() 和中位数的 R 函数中传递列名

2-6 R语言基础 缺失值

R语言-缺失值判断以及处理