替换任何对象的每个元素

时间:2015-09-22 07:55:26

标签: r recursion

是否有任何聪明的方法可以用某些值替换任何对象的每个部分(例如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)) ...等)?

1 个答案:

答案 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。

的向量