icecream_sandwich07
icecream_sandwich07

Reputation: 3

faster way to multiply each entry by a column

I have a data frame g with 3 columns, a, b and X. I need to multiply X with each entry in a and add to b to create a new variable. Right now i'm using a for loop

for(i in 1:N) {
    g$Eout[i] = mean((g$a[i]*g$X+g$b[i]-(g$X)^2)^2);
}

which is really slow in R. Is there anyway to do this faster?

Upvotes: 0

Views: 59

Answers (1)

r2evans
r2evans

Reputation: 160437

Try this:

set.seed(2)
N <- 30
g <- data.frame(a=1:N,b=seq(1,2,length.out=N),X=seq(10,20,length.out=N))
g$new <- sapply(g$X, function(x) mean((g$a * x + g$b - x^2)^2))
head(g)
#   a        b        X      new
# 1 1 1.000000 10.00000 10735.67
# 2 2 1.034483 10.34483 11077.04
# 3 3 1.068966 10.68966 11416.58
# 4 4 1.103448 11.03448 11757.01
# 5 5 1.137931 11.37931 12101.40
# 6 6 1.172414 11.72414 12453.14

Since you want each value of X multiplying all values of g$a, etc, you need to resort to some vectorized goodness. (Using @thelatemail's suggested 3e4 takes about 7sec per sapply ...)

Upvotes: 2

Related Questions