分配给 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 <- 1:3
那么is.na(x) <- 2
似乎我们正在解决关于2 的x[2] <- NA
is.na<-
行为在各自的帮助中进行了描述。但我同意这种用法远非“直观”......
有谁知道是否还有更多功能,包括该功能(colnames()、class()、....)?我有兴趣了解为什么这样做(显然仅在某些功能(?)中,但不是全部)而不是重述现有文档,....
“那个功能”是什么意思?函数的赋值变体?这只是方便。最重要的例子是`[<-`
(子集赋值)。
【参考方案1】:
is.na(x) <- value
被翻译为'is.na<-'(x, value)
。
您可以将'is.na<-'(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<-'(x, val)
等价于fun(x) <- val
的意义上,所有的工作方式都相同。但在那之后,它们的行为都像任何普通函数一样。
R 手册:3.4.4 Subset assignment
【讨论】:
另见cran.r-project.org/doc/manuals/r-release/…。语言定义值得一读。 @GGamba,我没有看到任何像 assign_NA() 这样的函数,所以我猜你只是想解释这个功能。但我没有得到原始代码。有没有另一种方法可以做到这一点,它并不神秘,只使用基本的简单 R?把这段代码放在一个关于 table() 之类的基本函数的教程中似乎很奇怪 @matt 请点击我在上面评论中提供的链接。这是“基本的简单 R”。每次执行x[1] <- 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)] <- NA
【讨论】:
以上是关于分配给 is.na(clinical.trial$age)的主要内容,如果未能解决你的问题,请参考以下文章