I have a data frame with a large number of variables. I am creating new variables by adding together some of the old ones. The code I am using to do so is:
n
My first instinct was to suggest to use sum() since then you can use the na.rm argument. However, this doesn't work, since sum() reduces it arguments to a single scalar value, not a vector.
This means you need to write a parallel sum function. Let's call this psum(), similar to the base R function pmin() or pmax():
psum <- function(..., na.rm=FALSE) {
x <- list(...)
rowSums(matrix(unlist(x), ncol=length(x)), na.rm=na.rm)
}
Now set up some data and use psum() to get the desired vector:
dat <- data.frame(
x = c(1,2,3, NA),
y = c(NA, 4, 5, NA))
transform(dat, new=psum(x, y, na.rm=TRUE))
x y new
1 1 NA 1
2 2 4 6
3 3 5 8
4 NA NA 0
Similarly, you can define a parallel product, or pprod() like this:
pprod <- function(..., na.rm=FALSE) {
x <- list(...)
m <- matrix(unlist(x), ncol=length(x))
apply(m, 1, prod, na.rm=TRUE)
}
transform(dat, new=pprod(x, y, na.rm=TRUE))
x y new
1 1 NA 1
2 2 4 8
3 3 5 15
4 NA NA 1
This example of pprod provides a general template for what you want to do: Create a function that uses apply() to summarize a matrix of input into the desired vector.