gpt4 book ai didi

r - R:在矩阵上应用函数并保持矩阵尺寸

转载 作者:行者123 更新时间:2023-12-03 09:20:15 24 4
gpt4 key购买 nike

因此,我想在R中的矩阵上应用函数。这对于简单的函数确实非常直观:

> (function(x)x*x)(matrix(1:10, nrow=2))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 9 25 49 81
[2,] 4 16 36 64 100

...但是很明显,我不了解它的所有功能:
> m = (matrix(1:10, nrow=2))
> (function(x) if (x %% 3 == 0) { return(NA) } else { return(x+1) })(m)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 3 5 7 9 11
Warning message:
In if (x == 3) { :
the condition has length > 1 and only the first element will be used

我仔细阅读了一下,发现了Vectorize和sapply,它们看起来都很不错,并且与我想要的一样,只是它们都将矩阵转换为列表:
> y = (function(x) if (x %% 3 == 0) { return(NA) } else { return(x+1) })
> sapply(m, y)
[1] 2 3 NA 5 6 NA 8 9 NA 11
> Vectorize(y)(m)
[1] 2 3 NA 5 6 NA 8 9 NA 11

...我想将其与当前尺寸保持在矩阵中。我该怎么办?谢谢!

最佳答案

@Joshua Ulrich(和Dason)有一个很好的答案。最好不使用y函数直接执行此操作。但是,如果确实需要调用函数,则可以使用vapply使其更快。它产生一个不带维数的 vector (如sapply,但速度更快),但是您可以使用structure将它们重新添加回去:

# Your function (optimized)
y = function(x) if (x %% 3) x+1 else NA

m <- matrix(1:1e6,1e3)
system.time( r1 <- apply(m,1:2,y) ) # 4.89 secs
system.time( r2 <- structure(sapply(m, y), dim=dim(m)) ) # 2.89 secs
system.time( r3 <- structure(vapply(m, y, numeric(1)), dim=dim(m)) ) # 1.66 secs
identical(r1, r2) # TRUE
identical(r1, r3) # TRUE

...如您所见, vapply方法比 apply快约3倍...并且 vapplysapply快的原因是 sapply必须分析结果以弄清楚它可以简化为数值 vector 。使用 vapply,您可以指定结果类型( numeric(1)),因此不必猜测...

更新我想出了另一种(较短的)保留矩阵结构的方法:
m <- matrix(1:10, nrow=2)
m[] <- vapply(m, y, numeric(1))

您只需使用 m[] <-将新值分配给对象。然后保留所有其他属性(例如 dimdimnamesclass等)。

关于r - R:在矩阵上应用函数并保持矩阵尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com