r_newbie
r_newbie

Reputation: 13

Calculating the row-means with certain conditions

Let's say I have a matrix like so:

df <- matrix(data = c(1,2,9,3,7,NA,4,NA,NA,NA,NA,NA), nrow=4, ncol=3, byrow=T)  

What I want to calculate, are the row-means of the matrix when the the row isn't allowed to have more than one NA. In this case the end result would be a vector of four components and more specifically c(4,5,NA,NA).

I can make separate vectors that meet the requirements like so:

df1 <- df[c(which(rowSums(is.na(df))<=1)),]

df2 <- df[c(which(rowSums(is.na(df))>1)),]

rowMeans(df1, na.rm=T)

rowMeans(df2, na.rm=F)

But I can't seem to figure out a good way to have just one vector.

Upvotes: 1

Views: 622

Answers (1)

akrun
akrun

Reputation: 886938

We can assign the rows that have more than 1 NAs to NA, and then do the rowMeans with na.rm=TRUE

df[rowSums(is.na(df))>1,] <- NA
rowMeans(df, na.rm=TRUE)

Or we can do this in one step

rowMeans(df, na.rm=TRUE)*NA^(rowSums(is.na(df))>1)

Or another option would be to create an index for getting the rowMeans

 i1 <- !rowSums(is.na(df))>1
 ifelse(i1, rowMeans(df, na.rm=TRUE), NA_real_)

Upvotes: 2

Related Questions