Question with R. Element wise multiplication, addition, and division with 2 data.frames with varying amounts of missing data in a given row

StackOverflow https://stackoverflow.com/questions/2840704

  •  27-09-2019
  •  | 
  •  

Question

I have a various data.frames with columns of the same length where I am trying to multiple 2 rows together element-wise and then sum this up. For example, below are two vectors I would like to perform this operation with.

> a.1[186,]
q01_a q01_b q01_c q01_d q01_e q01_f q01_g q01_h q01_i q01_j q01_k q01_l q01_m
    3     3     3     3     2     2     2     3     1    NA    NA     2     2

and

> u.1[186,]
q04_avl_a q04_avl_b q04_avl_c q04_avl_d q04_avl_e q04_avl_f q04_avl_g q04_avl_h q04_avl_i q04_avl_j q04_avl_k q04_avl_l q04_avl_m        
        4         2         3         4         3         4         4         4         3         4         3         3         3`

The issue is that various rows have varying numbers of NA's. What I would like to do is skip the multiplication with any missing values ( the 10th and 11th position from my above example), and then after the addition divide by the number of elements that were multiplied (11 from the above example). Most rows are complete and would just be multiplied by 13.

Thank you!

Was it helpful?

Solution

x <- c(3,3,3,3,2,2,2,3,1,NA,NA,2,2)
y <- c(4,2,3,4,3,4,4,4,3,4,3,3,3)

sum(x*y,na.rm = T)/sum(!is.na(x*y))
[1] 8

EDIT

In case of factors, first convert them to numeric

x <- as.factor(c(3,3,3,3,2,2,2,3,1,NA,NA,2,2))
y <- as.factor(c(4,2,3,4,3,4,4,4,3,4,3,3,3))
xy <- as.numeric(as.character(x)) * as.numeric(as.character(y))
sum(xy,na.rm = T)/sum(!is.na(xy))
[1] 8

OTHER TIPS

Making some progress here. I used substituteNA from the Fseries package to change all the missing values to zeros.

> sum(a.11[186,]*u.11[186,])/min((rowSums(a.11!=0)), rowSums(u.11!=0))

Now I just need to make this work in a loop!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top