我正在寻找一种更好的方法来按元素对矢量求和。 假设我们有3个向量:
a <- c(1, 2, 3, 4)
b <- c(5, 6, 7, 8)
c <- c(9, 10, 11, 12)
我想要
d = c(15, 18, 21, 24)
我一直在努力的方式是通过for循环,但我认为这有点单调乏味,并且对于大型向量可能会很慢,即:
for (j in 1:4){
d[j] = sum(c(a[j], b[j], c[j]))
}
R中是否有一个函数只是按元素位置将这些向量加在一起?
答案 0 :(得分:4)
试试这个
a+b+c
矢量化数学!欢呼声
答案 1 :(得分:3)
在我们colSums
向量'a','b'和'c'之后我们可以使用rbind
colSums(rbind(a,b,c))
#[1] 15 18 21 24
或者我们可以将其放在list
中并使用Reduce/+
Reduce(`+`, list(a,b,c))
#[1] 15 18 21 24
我使用colSums
作为+
在有NA
元素时有一些限制。例如。
a1 <- c(3, 2, NA, 1)
b1 <- c(5, NA, 3, 2)
a1+b1
#[1] 8 NA NA 3
而na.rm
中的colSums
参数可用于此类条件。
colSums(rbind(a1,b1), na.rm=TRUE)
#[1] 8 2 3 3
即使Reduce
方法也不好。
答案 2 :(得分:2)
@nongkrong是正确的,a+b+c
是最简单的方法。
@akrun也有关于NA的有效点。
但我想指出 1)其他功能类似的功能, 2)功能是更常见的对应物的矢量化版本, 3 )可以帮助您在任何情况下执行此任务的功能。
同样的习语适用于a*b*c
a*b*c
[1] 45 120 231 384
对于min
或max
,可以使用不同的功能:pmin
和
分别为pmax
。
pmin(a,b,c)
[1] 1 2 3 4
如果要将一个函数元素应用于一系列向量,
试试mapply
。
mapply(sum, a, b, c) # this answers your question!
[1] 15 18 21 24
注意,在将+
与mapply
(即mapply("+", a, b)
)结合使用时,您只能使用2个向量b / c +
需要2个值(而a+b+c
一次处理3个值,但调用+
两次!)。
另请注意,pmin
和sum
(mapply
内)可以通过na.rm=TRUE
广告轻松处理NA(例如,mapply(sum, a, b, c, na.rm=TRUE)
)
祝你好运,并欢迎R中的矢量化和其他漂亮技巧:)