tumultous_rooster
tumultous_rooster

Reputation: 12550

R: Properly using a dataframe as an argument to a function

I am practicing using the apply function in R, and so I'm writing a simple function to apply to a dataframe.

I have a dataframe with 2 columns.

 V1    V2
 1     3
 2     4

I decided to do some basic arithmetic and have the answer in the 3rd column, specifically, I want to multiply the first column by 2 and the second column by 3, then sum them.

 V1    V2    V3
 1     3     11
 2     4     16

Here's what I was thinking:

mydf <- as.data.frame(matrix(c(1:4),ncol=2,nrow=2))
some_function <- function(some_df) {some_df[,1]*2 +   
                                    some_df[,2]*3}
mydf <- apply(mydf ,2, some_function)

But what is wrong with my arguments to the function? R is giving me an error regarding the dimension of the dataframe. Why?

Upvotes: 0

Views: 138

Answers (1)

Troy
Troy

Reputation: 8691

Three things wrong:

1) apply "loops" a vector of either each column or row, so you just address the name [1] not [,1]
2) you need to run by row MARGIN=1, not 2
3) you need to cbind the result, because apply doesn't append, so you're overwriting the vector

mydf <- as.data.frame(matrix(c(1:4),ncol=2,nrow=2))

some_function <- function(some_df) {some_df[1]*2 +   
                                      some_df[2]*3}

mydf <- cbind(mydf,V3=apply(mydf ,1, some_function))

#  V1 V2 V3
#1  1  3 11
#2  2  4 16

but probably easier just to do the vector math:

mydf$V3<-mydf[,1]*2 + mydf[,2]*3 

because vector math is one of the greatest things about R

Upvotes: 1

Related Questions