是否有任何聪明的方法可以用某些值替换任何对象的每个部分(例如NA
' s)。
让我们采取这些对象
obj1 <- t.test(1:10)
obj2 <- matrix(1:9, 3)
obj3 <- 1:10
obj4 <- list(a = 1:10, b = letters[1:5], c = as.factor(1:10))
预期输出类似于
for (i in 1:length(obj1)) obj1[[i]] <- rep(NA, length(obj1[[i]]))
obj2 <- matrix(rep(NA, 9), 3)
obj3 <- rep(NA, 10)
obj4 <- list(a = rep(NA, 10), b = rep(NA, 5), c = rep(NA, 10))
所以无论一个对象是一个列表,矩阵,data.frame,vector等,该对象的每个部分都将被NA
替换。
有没有聪明的方法可以做到这一点,不需要多个循环,每次检查对象类型和很多异常(if (is.list(part)) ...
等)?
答案 0 :(得分:2)
您可以利用在分配期间使用空提取索引(即x[] <- NA
)用右侧值替换所有元素的事实。在您的情况下,您可以使用rapply
来执行此类操作来攻击所有对象的所有元素:
> rapply(mget(ls()), function(x) x[] <- rep(NA, length(x)), how = "replace")
$obj1
$obj1$statistic
[1] NA
$obj1$parameter
[1] NA
$obj1$p.value
[1] NA
$obj1$conf.int
[1] NA NA
$obj1$estimate
[1] NA
$obj1$null.value
[1] NA
$obj1$alternative
[1] NA
$obj1$method
[1] NA
$obj1$data.name
[1] NA
$obj2
[1] NA NA NA NA NA NA NA NA NA
$obj3
[1] NA NA NA NA NA NA NA NA NA NA
$obj4
$obj4$a
[1] NA NA NA NA NA NA NA NA NA NA
$obj4$b
[1] NA NA NA NA NA
$obj4$c
[1] NA NA NA NA NA NA NA NA NA NA
但这是一个非常简单的解决方案。您可能会将传递给rapply
的函数复杂化,以便它使用S3方法分派来识别它所看到的对象类,并可能相应地返回不同的数据结构(例如,data.frame或matrix),而不是只是NA
s。